簡體   English   中英

使用通用參數從反射訂閱事件

[英]Subscribe to event from reflection with generic parameters

好吧,所以我想使用反射來訂閱一個事件,該事件具有通用參數。

我還想確保當我說“訂閱活動”時,我使用了正確的術語。 我的意思是這樣的:

Mediator.EventMediator.Instance.PopulateItemsEvent += (sender, args) =>
        {
}

我想在你們中領先一些:Stackoverflow上有類似的問題,我已經閱讀了所有可以找到的問題。 大多數與沒有通用參數的事件或具有通用參數的方法有關。

因此,我有一個名為“ o”的變量,它本身是一個反映的屬性,它是一個ObservableCollection。 我想從“ o”事件中獲取事件(特別是“ CollectionChanged”)。 但這是我不知道該怎么做。

為了得到“ o”,我使用了如下反射:

var o = propertyInfo.GetValue(this, null);

我嘗試的第一個建議是“ GetRaisedMethod”,它是EventInfo的屬性。

因此,為了獲取EventInfo,我使用了以下代碼:

EventInfo evi = o.GetType().GetEvent("CollectionChanged", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

'evi'似乎包含正確的信息,但是如果我使用此行:

var invocation = evi.GetRaiseMethod();

我得到空。 但是我已經在瀏覽過的問題中讀到了這件事,這似乎很普遍。 即使如此,我仍然認為應該嘗試一下。

然后我繼續討論另一種方法,在另一個問題中提出該方法是否可行。 如下所示:

var field = typeof(ObservableCollection<>).GetField("CollectionChanged", BindingFlags.NonPublic | BindingFlags.Instance);
var eventDelegate = field.GetValue(o) as MulticastDelegate;

現在這給我造成了一個例外,我縮小到這兩行的第二行。 消息如下:

“不能對類型為Type.ContainsGenericParameters為true的字段執行后期綁定操作。”

因此,這就是我認為這是具有通用參數的事件的地方。 但是我找不到任何可以解決這個問題的地方。 當然,對於方法,您可以使用MethodInfo.MakeGenericMethod(),但EventInfo中沒有這樣的東西。

我想要的是能夠像平常一樣訂閱該事件,但到目前為止,它使我難以理解。

您可能還認為我可以做這樣的事情:

(o as ObservableCollection<>).CollectionChanged +=...

但是我不能。 我已經嘗試了上述所有形式的變體(沒有尖括號,帶有我自己的類型(類型為Type,這是集合中項目的類型)。沒有一種對我有用。肯定會更簡單,但是我還沒有找到使用這種方法的方法。

EventInfo.AddEventHandler方法可以為您完成工作,請看以下示例:

public static void Main()
{
    var collection = new ObservableCollection<string>(new [] { "a", "b" });
    var o = (object)collection;

    var eventInfo = o.GetType().GetEvent("CollectionChanged");
    var myEventHandler = new Action<object, NotifyCollectionChangedEventArgs>(( s, a ) => Console.WriteLine(a));
    var del = Delegate.CreateDelegate(eventInfo.EventHandlerType, myEventHandler.Method);

    eventInfo.AddEventHandler(o, del);

    collection.Add( "x" );
}

暫無
暫無

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

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