使用 ObservableCollection<T> 作为没有特定类型的参数
Use ObservableCollection<T> as argument without specific type
假设我们有两个 ObservableCollection:
private ObservableCollection<Barcode> barcodeCollection;
private ObservableCollection<User> userCollection;
我有两种方法可以用这样的数据库中的项目填充它们(我使用 Backgroundworker):
DispatcherObject.Invoke(
new System.Action(() => BarcodeCollection.Add(new Barcode(dr))));
其余的方法非常重复,我想我可以只用一种方法封装一些代码,然后像这样传递 ObservableCollection:
private void LoadCollection(ObservableCollection<T> observableCollection)
{
}
但这当然行不通..你能给我一些提示吗?把两个方法的代码都复制过来,只改了一部分,感觉很奇怪
如果您像这样更改方法签名(向其添加泛型类型参数):
private void LoadCollection<T>(ObservableCollection<T> observableCollection)
{
}
它应该可以工作,因为它将从您传递给方法的集合中推断出通用参数。但是当然,此方法中的代码不应该对类型 T 做出任何假设(除非您使用 where 关键字指定泛型类型约束)
根据@StasIvanov 的回答,您只是缺少签名中的通用类型参数:
private void LoadCollection<T>(ObservableCollection<T> observableCollection)
{
}
如果您的 class 具有通用接口或 class,您可以扩展它以使用特定的通用类型,例如:
private void LoadCollection<T>(ObservableCollection<T> observableCollection) where T : IMarkDeleted
{
//you can then use common properties within the method
observableCollection.Where(x => !x.MarkedAsDeleted);
}
此外,如果您计划使用其他通用方法,您可能会受益于将这些方法放在 class 中,在这种情况下,您只需要在 class 级别包含一次通用规范和您的方法不需要它:
public class ObservableCollectionHelper<T> where T : IEntity, IMarkDeleted
{
public static T NewItem()
{
return Activator.CreateInstance<T>();
}
private void LoadCollection(ObservableCollection<T> observableCollection)
{
}
private void DeleteCollection(ObservableCollection<T> observableCollection)
{
}
}
假设我们有两个 ObservableCollection:
private ObservableCollection<Barcode> barcodeCollection;
private ObservableCollection<User> userCollection;
我有两种方法可以用这样的数据库中的项目填充它们(我使用 Backgroundworker):
DispatcherObject.Invoke(
new System.Action(() => BarcodeCollection.Add(new Barcode(dr))));
其余的方法非常重复,我想我可以只用一种方法封装一些代码,然后像这样传递 ObservableCollection:
private void LoadCollection(ObservableCollection<T> observableCollection)
{
}
但这当然行不通..你能给我一些提示吗?把两个方法的代码都复制过来,只改了一部分,感觉很奇怪
如果您像这样更改方法签名(向其添加泛型类型参数):
private void LoadCollection<T>(ObservableCollection<T> observableCollection)
{
}
它应该可以工作,因为它将从您传递给方法的集合中推断出通用参数。但是当然,此方法中的代码不应该对类型 T 做出任何假设(除非您使用 where 关键字指定泛型类型约束)
根据@StasIvanov 的回答,您只是缺少签名中的通用类型参数:
private void LoadCollection<T>(ObservableCollection<T> observableCollection)
{
}
如果您的 class 具有通用接口或 class,您可以扩展它以使用特定的通用类型,例如:
private void LoadCollection<T>(ObservableCollection<T> observableCollection) where T : IMarkDeleted
{
//you can then use common properties within the method
observableCollection.Where(x => !x.MarkedAsDeleted);
}
此外,如果您计划使用其他通用方法,您可能会受益于将这些方法放在 class 中,在这种情况下,您只需要在 class 级别包含一次通用规范和您的方法不需要它:
public class ObservableCollectionHelper<T> where T : IEntity, IMarkDeleted
{
public static T NewItem()
{
return Activator.CreateInstance<T>();
}
private void LoadCollection(ObservableCollection<T> observableCollection)
{
}
private void DeleteCollection(ObservableCollection<T> observableCollection)
{
}
}