簡體   English   中英

使用反射獲取System.Nullable的Value屬性 <T> .NET Compact Framework上

[英]Use reflection to get the Value property of System.Nullable<T> on .Net Compact Framework

下面的代碼在.Net 3.5上運行良好:

PropertyInfo propertyInfo = typeof(int?).GetProperty("Value");
int? i = 5;
object o = propertyInfo.GetValue(i, null);

運行后, oint類型,值為5 沒關系

當我在.Net Compact Framework 3.5上運行相同的代碼時,在最后一行得到一個InvalidProgramException

  • 為什么會這樣呢?
  • 有什么我可以做的嗎?
  • 這是.Net CF中的錯誤嗎?

我當前正在做的事情是確定我正在處理的Type是否為System.Nullable<T>並且所獲取的屬性的名稱為"Value" ,然后顯式處理該情況。 但我想知道是否有更簡單的解決方案。

我正在編寫的代碼解析一個表達式樹(我們使用在.Net CF上實現System.Linq.Expressions的mono dll)。 當我使用反射獲取代表可為空的常量的ConstantExpression的值時,就會出現問題。

  • 為什么會這樣呢?
    特別是因為當您查詢它時, i是一個int而不是一個可為null的值(繼續執行i.GetType()並查看我的意思),因此CF看到您嘗試讀取傳遞的對象上不存在的屬性在
  • 有什么我可以做的嗎?
    這取決於您的用例。 在這種確切的情況下,可能不是-框架的行為方式相同,您無法更改它。 就是說,我在OpenNETCF ORM中使用可為空的類型,所以我去看看它是如何工作的,它們的“關鍵”似乎是我支持的可為空類型是我所用的類中的屬性。 所以這工作:

     class Foo { public int? i { get; set; } } static class Program { static void Main() { var f = new Foo(); var p = f.GetType().GetProperty("i", BindingFlags.Instance | BindingFlags.Public); fi = 5; var v = p.GetValue(f, null); p.SetValue(f, 3, null); } } 
  • 這是.Net CF中的錯誤嗎?
    絕對是行為上的差異。 您必須查看ECMA規范以了解其行為。 可能是它實際上在桌面上不正確,或者該行為實際上沒有定義,因此都不是“正確”或“錯誤”的。 令人驚訝的是,我看到了CF正確而台式機不合適的情況。

暫無
暫無

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

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