簡體   English   中英

C#在運行時動態轉換通用對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM