C#中的泛型类型

Lin*_*say 2 c# generics observablecollection c#-4.0

对于类型Loan,Client和Book,我有三种类似的方法.我是编程学生,我想知道是否可以传入参数,一个与这3个类匹配的泛型类型,我的意思是在括号之间传递一个不同的类型,比如<T>三个类只有一个方法.我试过<object>但它不起作用.

public void LoadStoreLoans(ObservableCollection<Loan> loansCollection)
{
     IList<Loan> loans = db.Query<Loan>(); //db4o 
     loansCollection = loans != null ? new ObservableCollection<Loan>(loans) : new ObservableCollection<Loan>();
}
Run Code Online (Sandbox Code Playgroud)

Thnks.

Mat*_*ten 9

是的,如果你总是替换它(这不是可观察集合的目的),我建议使集合成为返回值:

public ObservableCollection<T> LoadStoreCollection<T>()
{
     IList<T> queried = db.Query<T>();
     return queried != null ? new ObservableCollection<T>(queried) : new ObservableCollection<T>();
}
Run Code Online (Sandbox Code Playgroud)

第一次尝试使用对象:我从未使用过db4o,但我认为它使用函数中给定的类型参数(LoadT)Query来推断要查询的表.由于object没有表格,因此会产生错误object.您需要指定代理类型或更好 - 一个泛型类型参数 - 它将在执行期间绑定到实际类型.调用时T = Loan,db.Query调用可以查询Loan表,就像您首先编写db.Query<Loan>的一样.

由于集合是问题中的一个参数,人们可能会认为你会多次调用该函数T,但是:始终重新初始化相同的可观察集合变量,同时new禁用可观察集合可以提供的所有好处,例如,你永远不会收到一个集合更改事件(因为你监听被替换的集合),你不能将它绑定到一个控件,如果你注册一些其他对象的事件,你将引入一个内存洞:)