簡體   English   中英

我可以打電話給我嗎 <T> 作為委托存儲

[英]Can I call an Action<T> stored as delegate

我將動作存儲為委托。 我也將T存儲為接口。

以后有什么方法可以調用Action並傳遞對象嗎?

public class MyAction {
    public IMyObject IMyObject { get; set; }
    public Delegate myDelegate { get; set; }
    public Type IMyObjectType { get; set; }
}

其中IMyObject是一個空接口

public interface IMyObject { }

我從動作回調創建MyAction實例

public static MyAction Factory<T>(Action<T> callback) {
            return new MyAction() {
                myDelegate = callback, IMyObjectType = typeof (T)
            };
        }

是否可以調用委托並傳遞IMyObject?

稍后,我在嘗試調用Delegate(Action)之前設置了IMyObject。

也使MyAction通用

class MyAction<T> where T : IMyObject
{
   public T IMyObject { get; set; }
   public Action<T> action { get; set; }
   public Type IMyObjectType { get { return typeof(T); }
}

問題是,除非在編譯時知道參數的類型,否則您將無法創建MyAction,除非您使用反射創建了該參數(如果您多次調用該操作並希望優化執行,這可能會很有用)。

使用DynamicInvoke調用操作 (該操作使用反射並且非常慢)。

您也可以考慮使其成為包含參數的Action 這取決於您的要求。

myDelegate = () => callback(argument);

如果類型不是固定的(例如:它只是Delegate ,而您不知道T ),則可以使用:

action.myDelegate.DynamicInvoke(args);

但這比較慢。 如果您要進行大量操作,則應避免這種情況。 坦白地說,在整個過程中只使用Action<object> (或類似的Action<object> )並在回調中進行強制轉換會更有效-然后您的代碼將知道委托類型並可以使用常規調用。

您必須使用Delegate.DynamicInvoke來調用無類型的Delegate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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