确定类型是否可转换为IDictionary <string,object =“”>,其中Key可以是任何类型

时间:2016-01-29 01:02:01

标签: c# generics reflection type-conversion

假设我们有一个实现IDictionary<string, string>的类型。它被称为MyStringDictionary

我正在做一些属性/字段/方法反射,并想知道该成员是否是我可以转换为IDictionary<string, object>的类型。

我知道typeof(IDictionary<string, string>).IsAssignableFrom(typeof(MyStringDictionary))将是真的,因为两个通用参数都匹配。但是,我不会直接分配到<string, string>,而是会转换为<string, object>,如下所示:

public class MyStringDictionary : IDictionary<string, string> {
   // Notice that the class itself has no generic type arguments!
}

MyStringDictionary myStringDict = GetBigDictionary();
IDictionary<string, object> genericDict = myStringDict
   .ToDictionary(kvp => kvp.Key, kvp => (object) kvp.Value);

如何确定此转换是否可行?

我原以为我可以查看它是否实现了IEnumerable<KeyValuePair<,>>,但我再次因为我不知道Value的类型参数而感到困惑,并且不知道我需要知道它,因为它只会被装箱object

1 个答案:

答案 0 :(得分:2)

  

我在想我可以查看它是否实现了function selectedSwitch() { $('.selectedSwitch').each(function() { $(this).on("mouseover", function(e) { e.preventDefault(); var current = $(this).data('selected'); $('.selected.post-'+current).stop().animate({'opacity': 1}, 200); $('.selected.post-'+current).siblings().stop().animate({'opacity': 0}, 200); }); $(this).on("mouseout", function(e) { e.preventDefault(); var current = $(this).data('selected'); $('.selected.post-'+current).stop().animate({'opacity': 0}, 200); }); }); }

当然,这是要走的路!现在,有关如何的详细信息,请执行此操作:浏览IEnumerable<KeyValuePair<,>>的结果,然后调用以下方法。如果返回myObj.GetType().GetInterfaces(),则第二个和第三个参数将设置为键的类型和值的类型。

true

private static bool IsEnumKvp(Type t, out Type k, out Type v) { k = v = null; if (!t.IsGenericType) return false; var genDef = t.GetGenericTypeDefinition(); if (genDef != typeof(IEnumerable<>)) return false; var itemType = t.GenericTypeArguments[0]; if (!itemType.isGenericType) return false; var genItemDef = itemType.GetGenericTypeDefinition(); if (genItemDef != typeof(KeyValuePair<,>)) return false; var kvpTypeArgs = genItemDef.GenericTypeArguments; k = kvpTypeArgs[0]; v = kvpTypeArgs[1]; return true; } 上调用此方法应生成MyStringDictionary

true

请注意,此方法可能会返回foreach (var t : MyStringDictionary.GetType().GetInterfaces()) { Type keyType, valType; if (IsEnumKvp(t, out keyType, out valType)) { Console.WriteLine( "Your class implements IEnumerable<KeyValuePair<{0},{1}>>" , keyType.FullName , valType.FullName ); } } 多种类型。