假设我们有一个实现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
。
答案 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
);
}
}
多种类型。