从通用类实现的接口调用泛型类中的泛型属性

时间:2010-02-04 03:53:32

标签: c# generics

我有一个具有一个类型参数(T)的泛型类。我需要存储这些不同类型的通用对象的集合,因此我创建了一个通用类按照建议的here实现的接口。在迭代通过包含Interface对象集合的泛型列表时,我需要访问类型T的泛型类中的属性。到目前为止,我能够获得该值的唯一方法是使用反射调用方法。

interface ISomeClass {

//?
}

class SomeClass<T> : ISomeClass {

 T ValueINeed { get; set;}
}

class ClassThatHasListOfGenericObjects{

 List<ISomeClass> _l = new List<ISomeClass>();

 public AddToList<T>(T someClass) : where T : ISomeClass {

 _l.Add(someClass);

 }

 public SomeMethod(){

   foreach(ISomeClass i in _l){

   i.ValueINeed; //I don't know how to access the property in the generic class

   }
 }
}

4 个答案:

答案 0 :(得分:5)

我认为你有两种选择。简单的选择是在接口上公开值(作为对象)(也可能是它的类型)。这是看起来的样子:

interface ISomeClass
{
    object ValueINeed { get; set; }
    // Only needed if you care about static type rather than using ValueINeed.GetType()
    Type TypeOfValue { get; }
}

class SomeClass<T> : ISomeClass
{
    public T ValueINeed { get; set; }
    public Type TypeOfValue { get { return typeof(T); } }

    object ISomeClass.ValueINeed { get { return ValueINeed; } set { ValueINeed = (T)value; } }
}

这样做有一个缺点,就是会进行一些强制转换,你可能需要调用反射来对值进行某些操作。它的优点是易于理解和实施。

另一种选择是编码“存在类型”,它真正代表某个未知SomeClass<T>的{​​{1}}(如Java中的T)。这要复杂得多,难以遵循,但避免任何演员阵容:

SomeClass<?>

答案 1 :(得分:0)

ValueINeed添加到界面,您就可以在SomeMethod()中调用它。

答案 2 :(得分:-1)

我想你可能只需要一点点重构。看起来你几乎就在那里

interface ISomeClass<T> {
  T ValueINeed { get; set; }
}

class SomeClass<T> : ISomeClass {

 T ValueINeed { get; set;}
}

class ClassThatHasListOfGenericObjects{

 List<ISomeClass> _l = new List<ISomeClass>();

 public AddToList<T>(T someClass) : where T : ISomeClass {

 _l.Add(someClass);

 }

 public SomeMethod(){

   foreach(ISomeClass i in _l){

   i.ValueINeed; //this will work now, since it's in the interface

   }
 }
}

答案 3 :(得分:-1)

您使用的元素类型为ISomeClass,因此如果要访问成员属性,您需要将i强制转换为SomeClass或将属性减速添加到接口

interface ISomeClass {
    T ValueNeeded
    {
        get;
        set;
    }
}

请注意,您仍需要在SomeClass中实现该属性。