使用 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)
    {
    }
}