将项目添加到通用的observablecollection

时间:2019-01-13 21:07:10

标签: c# generics observablecollection

我想要一个具有通用ObservableCollection返回类型的方法。 在这种方法中,ObservableCollection将充满员工,合同或假期之类的对象,这是目前需要的。因此它可以是员工列表,合同或假期。所有都是具有不同属性的类。 以下代码给我一个错误,那就是Employee无法转换为T。我还必须做什么?

public static ObservableCollection<T> getList<T>()
{
    ObservableCollection<T> result = new ObservableCollection<T>();

    Common.Employee employee = new Common.Employee();
    result.Add(employee);

    return result;
}

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是定义一个空接口,例如IEntity并声明Employee类实现了此接口:

interface IEntity
{

}

class Employee : IEntity
{

}

然后,您应该在签名方法中要求T实现IEntity并更改为局部变量employee声明的类型:

public static ObservableCollection<T> GetList<T>() where T : IEntity
{
    ObservableCollection<T> result = new ObservableCollection<T>();

    IEntity employee = new Common.Employee();
    result.Add(employee);

    return result;
}

尽管事实,但上述方法将解决编译错误,但我没有实现GetList方法。为什么在通用方法中,我们必须创建特定对象的实例,然后将其添加到列表中并返回此列表?这样做的目的是什么?

答案 1 :(得分:0)

如果具有通用方法,则不应在其内部初始化对象的特定实现。更好的选择是让调用者传递通用对象类型的参数,然后将其添加到集合中。

public static ObservableCollection<T> getList<T>(T observableItem)
{
    ObservableCollection<T> result = new ObservableCollection<T>();
    result.Add(observableItem);
    return result;
}

或者,您可以在方法中创建T的新实例。

public static ObservableCollection<T> getList<T>() where T : new()
{
    ObservableCollection<T> result = new ObservableCollection<T>();

    T observableItem = new T();

    result.Add(observableItem);
    return result;
}