簡體   English   中英

比較類型,如果一個可以為空

[英]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;

我現在想要的是以下也返回true:

var test3=AreOfTheSameType(new int?(), new int()) 

因此,如果類型具有相同的基礎,但是一個可以為空,另一個不是,我也想將其返回為真。 或者以另一種方式說我希望有一個函數返回我是否可以直接使用反射將obj1存儲到obj2而不必轉換值。

UPDATE

我減少了我的代碼,使其更具可讀性。 看起來這次是反作用的。 真實世界代碼如下:

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]"

雖然不一樣但可以分配

雖然不一樣但可以分配

看起來你在Type.IsAssignableFrom方法之后:

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

Console.WriteLine(dt.IsAssignableFrom(nd)); // false
Console.WriteLine(nd.IsAssignableFrom(dt)); //true

實例: http//rextester.com/KDOW15238

在可空類型上調用GetType返回原始類型:

int? i = 5;  
Type t = i.GetType();  
Console.WriteLine(t.FullName); //"System.Int32"  

所以AreOfTheSameType((int?)5, 5)應該返回true

但是只要你打開一個Nullable<T> ,你就會得到null (如果Nullable<T>.HasValuefalse ),或者你獲得了盒裝底層值,失去了“可空”部分。 所以你在這里遇到的問題是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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM