我目前正在構建一個節點編輯器(as in Blender),並且無法從泛型類型獲取委託給屬性訪問器。到目前爲止,here這個問題給我帶來了最接近的,但我遇到了麻煩,我認爲它與通用對象的類型具體相關。如何從泛型類型獲取委託給屬性訪問器?
作爲參考,「節點」與對象同義,「端口」與屬性同義。
這是違規的代碼,它是類Node
的一部分。 NodePort
類是可以在屬性上設置的屬性,以提供屬性的詳細信息(例如人類可讀名稱和數據流向)。
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>.GetValue
和NodeInput<T>.SetValue
被定義爲這樣:
public delegate T GetValue();
public delegate void SetValue(T value);
...分別NodeOutput
和NodeInput
。
有沒有人有任何經驗與財產訪問者創建代表?任何想法如何可能會有所不同,當問題的類型是通用的?
任何類型的屬性都可以用* NodePort *來裝飾嗎? – Elisha 2009-10-17 08:36:16
是的。 'NodePort'可以應用於任何屬性。 – 2009-10-17 08:56:55