比较类型是否可为空
Compare types if one is nullable
我需要检查两种类型是否相同:
private bool AreOfTheSameType(object obj1, object obj2) {
return obj1.GetType()==obj2.GetType();
}
这适用于以下值:
var test1=AreOfTheSameType(new DateTime(), new DateTime()) // true;
var test2=AreOfTheSameType(new int(), new DateTime()) // false;
我现在想要的是以下 return 也是正确的:
var test3=AreOfTheSameType(new int?(), new int())
因此,如果类型具有相同的基础,但一个可以为 null,另一个不能,我也希望 return 它为真。或者换句话说,我想要一个函数 return 是否可以直接使用反射将 obj1 存储到 obj2 而无需强制转换值。
更新
我减少了我的代码以使其更具可读性。看来这次适得其反。真实代码如下:
var entity = Activator.CreateInstance(typeof(T));
Type entityType = typeof(T);
PropertyInfo[] entityProperties = entityType.GetProperties();
foreach (KeyValuePair<string, object> fieldValue in item.FieldValues)
{
if (fieldValue.Value == null) continue;
var property = entityProperties.FirstOrDefault(prop => prop.Name == fieldValue.Key);
if (property != null && property.CanWrite)
{
Type valueType = fieldValue.Value.GetType();
if (fieldValue.Value.GetType() == property.PropertyType) {
// Assign
}
}
}
“//Assign”行的问题是,我有以下两种类型:
fieldValue.Value.GetType().ToString()="System.DateTime"
property.PropertyType.ToString()="System.Nullable`1[System.DateTime]"
明显不同但可以分配
在可空类型 return 上调用 GetType
原始类型:
int? i = 5;
Type t = i.GetType();
Console.WriteLine(t.FullName); //"System.Int32"
所以 AreOfTheSameType((int?)5, 5)
应该 return true
。
但是一旦你装箱 Nullable<T>
,你要么得到 null
(如果 Nullable<T>.HasValue
是 false
),要么你得到装箱的基础值,失去"nullable" 部分。所以你在这里面临的问题是 new int?
在传递给方法时将被装箱到 null
对象中。
可空类型的问题是空值框到 null
,一旦它们是 null
,您无法 找出它们是什么.那么,解决这个问题的唯一方法就是使用泛型:
private bool AreOfTheSameType<T1,T2>(T1 obj1, T2 obj2) {
// get the types as best we can determine
var t1 = obj1?.GetType() ?? typeof(T1);
var t2 = obj2?.GetType() ?? typeof(T2);
// Nullable<T> => T
t1 = Nullable.GetUnderlyingType(t1) ?? t1;
t2 = Nullable.GetUnderlyingType(t2) ?? t2;
// compare
return t1 == t2;
}
这将使用对象如果可用(允许子类等),但如果对象为 null 将回退到 typeof
- 这意味着它应该为 int?
等工作... 只要 传入的表达式类型不是 object
开头;如果它 是 object
并且值是 null
,那么......你运气不好 - 你永远无法找到原始类型。我的意思是:
这应该没问题:
var test3=AreOfTheSameType(new int?(), new int());
但这会失败:
object x = new int?(), y = new int();
var test4=AreOfTheSameType(x, y);
which are obiously not the same but could be assigned
您似乎在使用 Type.IsAssignableFrom
方法:
var dt = typeof(DateTime);
var nd = typeof(DateTime?);
Console.WriteLine(dt.IsAssignableFrom(nd)); // false
Console.WriteLine(nd.IsAssignableFrom(dt)); //true
我需要检查两种类型是否相同:
private bool AreOfTheSameType(object obj1, object obj2) {
return obj1.GetType()==obj2.GetType();
}
这适用于以下值:
var test1=AreOfTheSameType(new DateTime(), new DateTime()) // true;
var test2=AreOfTheSameType(new int(), new DateTime()) // false;
我现在想要的是以下 return 也是正确的:
var test3=AreOfTheSameType(new int?(), new int())
因此,如果类型具有相同的基础,但一个可以为 null,另一个不能,我也希望 return 它为真。或者换句话说,我想要一个函数 return 是否可以直接使用反射将 obj1 存储到 obj2 而无需强制转换值。
更新
我减少了我的代码以使其更具可读性。看来这次适得其反。真实代码如下:
var entity = Activator.CreateInstance(typeof(T));
Type entityType = typeof(T);
PropertyInfo[] entityProperties = entityType.GetProperties();
foreach (KeyValuePair<string, object> fieldValue in item.FieldValues)
{
if (fieldValue.Value == null) continue;
var property = entityProperties.FirstOrDefault(prop => prop.Name == fieldValue.Key);
if (property != null && property.CanWrite)
{
Type valueType = fieldValue.Value.GetType();
if (fieldValue.Value.GetType() == property.PropertyType) {
// Assign
}
}
}
“//Assign”行的问题是,我有以下两种类型:
fieldValue.Value.GetType().ToString()="System.DateTime"
property.PropertyType.ToString()="System.Nullable`1[System.DateTime]"
明显不同但可以分配
在可空类型 return 上调用 GetType
原始类型:
int? i = 5;
Type t = i.GetType();
Console.WriteLine(t.FullName); //"System.Int32"
所以 AreOfTheSameType((int?)5, 5)
应该 return true
。
但是一旦你装箱 Nullable<T>
,你要么得到 null
(如果 Nullable<T>.HasValue
是 false
),要么你得到装箱的基础值,失去"nullable" 部分。所以你在这里面临的问题是 new int?
在传递给方法时将被装箱到 null
对象中。
可空类型的问题是空值框到 null
,一旦它们是 null
,您无法 找出它们是什么.那么,解决这个问题的唯一方法就是使用泛型:
private bool AreOfTheSameType<T1,T2>(T1 obj1, T2 obj2) {
// get the types as best we can determine
var t1 = obj1?.GetType() ?? typeof(T1);
var t2 = obj2?.GetType() ?? typeof(T2);
// Nullable<T> => T
t1 = Nullable.GetUnderlyingType(t1) ?? t1;
t2 = Nullable.GetUnderlyingType(t2) ?? t2;
// compare
return t1 == t2;
}
这将使用对象如果可用(允许子类等),但如果对象为 null 将回退到 typeof
- 这意味着它应该为 int?
等工作... 只要 传入的表达式类型不是 object
开头;如果它 是 object
并且值是 null
,那么......你运气不好 - 你永远无法找到原始类型。我的意思是:
这应该没问题:
var test3=AreOfTheSameType(new int?(), new int());
但这会失败:
object x = new int?(), y = new int();
var test4=AreOfTheSameType(x, y);
which are obiously not the same but could be assigned
您似乎在使用 Type.IsAssignableFrom
方法:
var dt = typeof(DateTime);
var nd = typeof(DateTime?);
Console.WriteLine(dt.IsAssignableFrom(nd)); // false
Console.WriteLine(nd.IsAssignableFrom(dt)); //true