如果可以为空,则比较类型

Ole*_*ers 4 c# reflection types nullable

我需要检查两种类型是否相同:

private bool AreOfTheSameType(object obj1, object obj2) {
  return obj1.GetType()==obj2.GetType();
}
Run Code Online (Sandbox Code Playgroud)

这适用于以下值:

var test1=AreOfTheSameType(new DateTime(), new DateTime()) // true;
var test2=AreOfTheSameType(new int(), new DateTime()) // false;
Run Code Online (Sandbox Code Playgroud)

我现在想要的是以下内容也返回 true:

var test3=AreOfTheSameType(new int?(), new int()) 
Run Code Online (Sandbox Code Playgroud)

因此,如果类型具有相同的基数,但一个是可为空的,另一个则不是,我也想将其返回为 true。或者换一种方式说,我想要一个函数来返回是否可以使用反射直接将 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
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

“//Assign” - 行上的问题是,我有以下两种类型:

fieldValue.Value.GetType().ToString()="System.DateTime"
property.PropertyType.ToString()="System.Nullable`1[System.DateTime]"
Run Code Online (Sandbox Code Playgroud)

显然不相同但可以分配

Jam*_*iec 7

显然不相同但可以分配

看起来你在追求这个Type.IsAssignableFrom方法:

var dt = typeof(DateTime);            
var nd = typeof(DateTime?);

Console.WriteLine(dt.IsAssignableFrom(nd)); // false
Console.WriteLine(nd.IsAssignableFrom(dt)); //true
Run Code Online (Sandbox Code Playgroud)

现场示例:http : //rextester.com/KDOW15238