gpt4 book ai didi

c# - 如何从泛型类型中获取对属性访问器的委托(delegate)?

转载 作者:太空宇宙 更新时间:2023-11-03 11:52:59 24 4
gpt4 key购买 nike

我目前正在构建一个节点编辑器 ( as in Blender ),但无法从泛型类型获取属性访问器的委托(delegate)。至此问题here使我最接近,但我遇到了我认为与通用对象类型特别相关的问题。

作为引用,“节点”与对象同义,“端口”与属性同义。

这是有问题的代码,它是 Node 的一部分类(class)。 NodePort class 是一个属性,可以在属性上设置以提供属性的详细信息(例如人类可读的名称和数据流方向)。

public void SetTarget<T>(T Target)
{
//TODO: Finish clearing old IOs (if any)
Inputs.Clear();
Outputs.Clear();

//Keep track of the current target of this node.
ThisTarget = Target;

PropertyInfo[] pinfo = Target.GetType().GetProperties();

foreach (PropertyInfo property in pinfo)
{
Attribute[] attrs = Attribute.GetCustomAttributes(property);
foreach (Attribute attribute in attrs)
{
// If the property has a NodePort attribute, it's specifically requesting to be available as a port on the node.
if (attribute is NodePort)
{
NodePort PortDetails = (NodePort)attribute;

if (PortDetails.Direction == NodePort.NodePortDirection.PORT_INPUT)
{
// This line throws an ArgumentException, and the only message is "Error binding to target method."
NodeInput<T>.SetValue Setter = (NodeInput<T>.SetValue)Delegate.CreateDelegate(typeof(NodeInput<T>.SetValue), (T)Target, property.GetSetMethod());
AddInput(Setter, PortDetails.CommonName);
}
else if (PortDetails.Direction == NodePort.NodePortDirection.PORT_OUTPUT)
{
// Same exception here.
NodeOutput<T>.GetValue Getter = (NodeOutput<T>.GetValue)Delegate.CreateDelegate(typeof(NodeOutput<T>.GetValue), (T)Target, property.GetGetMethod());
AddOutput(Getter, PortDetails.CommonName);
}
}
}

}
}

NodeOutput<T>.GetValueNodeInput<T>.SetValue定义如下:

public delegate T GetValue();
public delegate void SetValue(T value);

...在NodeOutputNodeInput分别。

有没有人有为属性访问器创建委托(delegate)的经验?知道当所讨论的类型是泛型时会有什么不同吗?

最佳答案

我认为您的类型不匹配。在您的第一行异常中,setter声明为 NodeInput<T> 类型,这意味着它是一个接受 T 并返回 void 的方法。但是您分配给 setter 的方法是 property.GetSetMethod(),这将是一个采用 property.PropertyType 并返回 void 的方法。这将导致异常,除非幸运的是 property.PropertyType 与 T 相同。对于 getter 也是如此。在你的第二个异常行上。

我怀疑你不能使用泛型来处理这个问题,因为你在编译时不知道 property.PropertyType,所以你不能将该类型作为泛型参数传递(因为泛型参数必须在编译时指定,除非你使用 type.MakeGenericType)。

关于c# - 如何从泛型类型中获取对属性访问器的委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1581702/

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