如何解决检查对象的类型为Dictionary还是Dictionary Union
我有一个功能
public static async void MyFunction(object Obj)
{
if (Obj.GetType() == typeof(Dictionary<string,string>))
{
// My Code
}
}
我要检查参数Obj
的类型为Dictionary<string,string>
还是Dictionary<string,string>.Union(Dictionary<string,string>)
。
我应该在上面的||
语句中加上什么if
条件,以便如果传递给函数的对象是 Dictioary 类型,它将执行if
块>或词典联盟?
我该怎么做?
解决方法
使用扩展方法:
public static bool IsAssignableToGenericType(this Type givenType,Type genericType) {
if (givenType.IsGenericType && givenType.IsGenericEqual(genericType))
return true;
if (givenType.GetInterface(genericType.Name) != null)
return true;
foreach (var it in givenType.GetInterfaces())
if (it.IsAssignableToGenericType(genericType))
return true;
var baseType = givenType.BaseType;
if (baseType == null)
return false;
return baseType.IsAssignableToGenericType(genericType);
}
您可以测试:
if (Obj.GetType().IsAssignableToGenericType(typeof(IEnumerable<KeyValuePair<string,string>>))) {
这不能保证Obj
是对Union
的调用的产物。如果需要这样做,则需要深入研究类型。
使用一些扩展方法可以使反射更容易:
public static class ObjectExt {
public static object GetPrivateValue<T>(this T obj,string memberName) =>
obj.GetType().GetPropertyOrField(memberName,BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public).GetValue(obj);
}
public static class TypeExt {
public static MemberInfo GetPropertyOrField(this Type t,string memberName,BindingFlags bf = BindingFlags.Public | BindingFlags.Instance) =>
t.GetMember(memberName,bf).Where(mi => mi.MemberType == MemberTypes.Field || mi.MemberType == MemberTypes.Property).Single();
}
public static class MemberInfoExt {
public static object GetValue(this MemberInfo member,object srcObject) {
switch (member) {
case FieldInfo mfi:
return mfi.GetValue(srcObject);
case PropertyInfo mpi:
return mpi.GetValue(srcObject);
case MethodInfo mi:
return mi.Invoke(srcObject,null);
default:
throw new ArgumentException("MemberInfo must be of type FieldInfo,PropertyInfo or MethodInfo",nameof(member));
}
}
}
您可以确定对象来自Union
中的Dictionary
。请注意,这取决于.Net Core的内部结构,将来可能无法使用:
var isDictUnion = (Obj.GetType() == unionType) && (Obj.GetPrivateValue("_first").GetType() == dictType) && (Obj.GetPrivateValue("_second").GetType() == dictType);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。