簡體   English   中英

給定一個集合對象,想分配給特定類型的局部變量

[英]Given a collection object, would like to assign to a local variable of specific type

我想用反射恢復類型信息。 我有

public Foo(object coll, string tValue)
{
   var x = col1 as IList;
   if (x != null)
      x.Action();

   var y = col1 as IDictionary;
   if (y != null)
      y.Action();
}

但是想擁有

public Foo(object coll, string tValue)
{
   var x = col1 as IList<TValue>;
   if (x != null)
      x.Action();

   var y = col1 as IDictionary<int, TValue>;
   if (y != null)
      y.Action();
}

是否可以到達並使用通用接口而不是舊式非泛型集合接口,只給出包含的類名?

一旦建立了局部變量類型,我就想避免在循環集合時支付反射和動態調用懲罰。

另一個例子,可能更清楚:

     var list = new Dictionary<int, MyObject>();
     list.Add(100, new MyObject());

     object listObject = list;

     var x = listObject as IDictionary<int, dynamic>;
     if (x != null)
     {
        foreach (var entry in x)
        {
           Console.WriteLine(entry.Key);
           Console.WriteLine(entry.Value);
        }
     }

x為空...

我不確定您是否打算為集合中的每個項目調用泛型集合的方法,或者您只想要來自泛型集合的值。

對於第三塊代碼,您可以繼續使用非泛型接口並使用枚舉器。

        var x = listObject as IDictionary;
        if (x != null)
        {
            var en = x.GetEnumerator();
            while(en.MoveNext())
            {
                Console.WriteLine(en.Key);
                Console.WriteLine(en.Value);
            }
        }

如果您打算在不知道通用IList或IDictionary的確切泛型類型的情況下調用方法,那么您將不得不使用MethodInfo.Invoke。 在循環外緩存MethodInfo以獲得較小的性能提升。 CreateDelegate會更快,但你需要知道確切的泛型類型。 您可以使用表達式樹來解決這個問題,但要維護的代碼量可能不值得獲得性能。 查看Jon Skeets中的MagicMethod文章讓反思飛行並探索代表

暫無
暫無

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

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