[英]Invoking a non-generic method which is declared in a base generic class throws exception with message
[英]Invoking generic method/delegate from a non-generic base class
我覺得我不是從正確的角度看待這個問題,而我只是沒有考慮其他解決方案。
假設這個泛型類;
public abstract class Port<T>
{
public delegate T PullDelegate();
private PullDelegate pull;
public Port(PullDelegate pull)
{
this.pull = pull;
}
public T Pull()
{
return pull();
}
}
它用於在圖形節點編輯器中定義“端口”。 端口可以將對象/值從一個節點傳輸到另一個節點,但它們也需要是“類型安全的”,這意味着我無法將任何端口插入另一個錯誤類型的端口(至少沒有一些轉換)。
節點“擁有”一個端口並為其一個方法賦予它一個委托,因此當另一個節點“拉”一個值時,該端口只是調用它並返回正確的值。
當我試圖從非泛型集合中調用Pull()
時,我的問題開始了。 顯然,我可以創建一個非泛型的基本方法,但是然后Pull不能返回T
,它需要返回object
。
此外,每個節點都有其端口的集合訪問器,因此其他項目可以獲取它們。 該收集必須是非泛型的,因為一個節點可以有許多類型的許多端口。
public abstract Port[] Inputs { get; }
public abstract Port[] Outputs { get; }
public abstract Port[] Entries { get; }
public abstract Port[] Exits { get; }
非泛型類型發揮作用的那一刻,通用的一切都變得無法訪問。 如果只有Port<>[]
會成為一件事。
我覺得我錯過了什么......
使Port<T>
使用顯式實現實現非通用接口IPort
。 以這種方式,它隱藏在API之外,但仍然允許您調用泛型類中的方法。
public interface IPort
{
object SomeAction(object data);
}
public class Port<T> : IPort
{
//[.. all other methods ..]
object IPort.SomeAction(object data)
{
var typedData = (T)data;
//invoke our typed version.
return SomeAction(data);
}
public T SomeAction(T data)
{
// ...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.