假设我们有一个NodeData
class:
public class NodeData<T>
{
public string Name;
public T Value;
public NodeData(string name, T value)
{
this.Name = name;
this.Value = value;
}
}
还有一个基地Node
具有多个类型属性的类和子类NodaData
:
public class Node
{
public List<NodeData<T>> listOutputs<T>()
{
var fieldInfos = GetType().GetFields();
var list = new List<NodeData<T>>();
foreach (var item in fieldInfos)
{
Type t = item.FieldType;
string name = item.Name;
if (t == typeof(NodeData<T>))
{
var output = new NodeData<T>(name, default(T));
list.Add(output);
}
}
return list;
}
}
public class TestNode : Node {
public NodeData<int> data;
public NodeData<double> data2;
public NodeData<double> data3;
public TestNode ()
{
data = new NodeData<int>("test", 111);
data2 = new NodeData<double>("test", 113);
}
}
正如您所看到的,有一种方法列出了所有类型的输出T
in the Node
所以我可以找到运行时子类的输出字段是什么:
TestNode node = new TestNode ();
var list = node.listOutputs<int>(); // this returns data
但我需要知道如何使用此方法列出任何类型 T 的所有节点输出。在此示例中int
and double
。我需要添加带有此签名的方法吗public List<NodeData<T>> listOutputs() // should return all properties data, data2, data3
。有可能有这样的方法吗?返回类型是通用的,但方法没有类型参数。
即使在您进行编辑之后,也不完全清楚您想要实现的目标,但以下是我的假设:
-您想要某种 Node 对象充当不同类型 NodeData 元素的容器。
- 您希望能够从此 Node 对象返回一个列表,该列表包含存储在 Node 容器中的所有 NodeData 元素,无论 NodeData 对象的类型如何。
无需从 listOutputs 方法返回 List> 对象,只需返回 List 对象的非泛型版本即可。那么你就不必在方法调用中处理T了。
然后,循环遍历非通用列表中的对象的逻辑可以检查类型以正确处理所包含的 NodeData 对象。
重要提示:我提出的解决方案并不漂亮,但我认为它回答了问题。在我看来,从面向对象的角度来看,所提供的代码(例如使用反射)已经存在严重缺陷,更好的解决方案必须从更改底层数据结构开始。但这只有在我们有更多信息如何使用时才能完成,例如什么样的逻辑消耗返回的列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)