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