我有一个具有一个类型参数(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
}
}
}
答案 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
中实现该属性。