[英]C# dynamically casting generic object at runtime
編輯:將錯誤的術語拳擊改為鑄造。
我有以下問題:
如果我創建一個新的Action或Func類型的Delegate,它將被強制轉換為Delegate類型。
var @delegate = Delegate.CreateDelegate(type, @object, methodInfo);
但是我需要一個通用類正確的強制對象。
考慮以下示例:
class Example<T> {
Type GenericType() {
return typeof(T);
}
}
static Example<T> Create<T>(T @delegate) {
return new Example<T>();
}
Example.Create(@delegate).GenericType();
這將返回Delegate作為類型,因為這是強制轉換對象的類型(@delegate)。
一種解決方案是像這樣強制委托:
if(@delegate is Action)
Example.Create((Action)@delegate).GenericType();
但是由於Delegate.CreateDelegate也可以創建Action或Func委托,因此無法檢查所有變體。
我無法更改泛型類,因此必須強制委托。
我希望我能解釋我的問題。 我不是說英語的人...
編輯:問題是typeof(T)不返回對象的“實際”類型。 但是,恐怕沒有解決辦法。
@delegate.GetType()
怎么獲取@delegate.GetType()
的實際類型?
另外,請注意:您誤用了“裝箱”一詞。
如果您可以使用.net 4.0,那么如果您將其強制轉換為動態,則可以使用上述方法
Example.Create((dynamic)@delegate).GenericType();
如果不能,那么您只需做一點反思和抽象。
abstract class Example{
abstract Type GenericType();
}
class Example<T>:Example {
override Type GenericType() {
return typeof(T);
}
}
static Example Create(Delegate @delegate) {
return (Example)Activator.CreateInstance(typeof(Example<>).MakeGenericType(new []{@delegate.GetType()}));
}
要回答我自己的問題:這是不可能的。 :(
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.