2012-06-05 80 views
2

我在網上找不到任何東西,可以幫助我解決這個問題,如果有人能幫助你,那將是一個救生員。C#反射日期時間?

我給函數賦了一個屬性名和對象。使用反射它返回該屬性的值。它完美的工作,但是如果我通過它一個可爲空的DateTime它給了我空,無論我嘗試我不能得到它的工作。

public static string GetPropValue(String name, Object obj) 
{ 
Type type = obj.GetType(); 
System.Reflection.PropertyInfo info = type.GetProperty(name); 
if (info == null) { return null; } 
obj = info.GetValue(obj, null); 
return obj.ToString(); 
} 

在上述函數中obj爲null。我怎樣才能讀取DateTime?

+5

那麼,可空'有一個非空值? –

+2

對不起,你在問如何獲取null的日期值? – asawyer

回答

0

可爲空的類型的類型爲Nullable<T>,它有兩個屬性:HasValueValue。您首先需要檢查HasValue以檢查是否設置了Value,那麼您可以從Value訪問實際數據。

要麼你檢查給定對象是否是一個Nullable<T>,做這些檢查在GetPropValue,或者你做這個方法之外這個邏輯,並確保你有一個非空值調用它。

編輯劃痕,according to MSDNGetType()總是給你的基礎類型。你確定你傳遞了一個非null對象嗎?

2

你的代碼是fine--這一天打印的時間:

class Program 
{ 
    public static string GetPropValue(String name, Object obj) 
    { 
     Type type = obj.GetType(); 
     System.Reflection.PropertyInfo info = type.GetProperty(name); 
     if (info == null) { return null; } 
     obj = info.GetValue(obj, null); 
     return obj.ToString(); 
    } 

    static void Main(string[] args) 
    { 
     var dt = GetPropValue("DtProp", new { DtProp = (DateTime?) DateTime.Now}); 
     Console.WriteLine(dt); 
    } 
} 

爲了避免空值異常,改變GetPropValue最後一行:

return obj == null ? "(null)" : obj.ToString(); 
1

該作品對我來說很好..

你確定你的PropertyInfo返回一個非null嗎?

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyClass mc = new MyClass(); 
     mc.CurrentTime = DateTime.Now; 
     Type t = typeof(MyClass); 
     PropertyInfo pi= t.GetProperty("CurrentTime"); 
     object temp= pi.GetValue(mc, null); 
     Console.WriteLine(temp); 
     Console.ReadLine(); 
    } 

} 
public class MyClass 
{ 
    private DateTime? currentTime; 

    public DateTime? CurrentTime 
    { 
     get { return currentTime; } 
     set { currentTime = value; } 
    } 
}