gpt4 book ai didi

c# - 从泛型类实现的接口(interface)调用泛型类中的泛型属性

转载 作者:行者123 更新时间:2023-11-30 22:47:29 25 4
gpt4 key购买 nike

我有一个具有一个类型参数 (T) 的泛型类。我需要存储这些不同类型的通用对象的集合,因此我创建了一个通用类按照建议实现的接口(interface) 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

}
}
}

最佳答案

在我看来,您有两个选择。简单的选择是在接口(interface)(可能还有它的类型)上公开值(作为对象)。这是它的样子:

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> 的“存在​​类型”进行编码对于一些未知的 T (就像 Java 中的 SomeClass<?>)。这要复杂得多且难以遵循,但可以避免任何类型转换:

interface ISomeClassUser<X>
{
X Use<T>(SomeClass<T> s);
}

interface ISomeClassUser
{
void Use<T>(SomeClass<T> s);
}

interface ISomeClass
{
X Apply<X>(ISomeClassUser<X> user);
void Apply(ISomeClassUser user);
}

class SomeClass<T> : ISomeClass
{
public T ValueINeed { get; set; }

public X Apply<X>(ISomeClassUser<X> user) { return user.Use(this); }
public void Apply(ISomeClassUser user) { user.Use(this); }
}

// Assumes you want to get a string out, use a different generic type as needed
class XmlUser : ISomeClassUser<string>
{
public string Use<T>(SomeClass<T> s)
{
string str = "";
// do your conditional formatting here, branching on T as needed
// ...
return str;
}
}

class ClassThatHasListOfGenericObjects
{
List<ISomeClass> _l = new List<ISomeClass>();
XmlUser user = new XmlUser();

public string SomeMethod()
{
string s = "";
foreach (ISomeClass i in _l)
{
s += i.Apply(user);
}
return s;
}
}

关于c# - 从泛型类实现的接口(interface)调用泛型类中的泛型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2197211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com