[英]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);
運行后, o
為int
類型,值為5
。 沒關系
當我在.Net Compact Framework 3.5上運行相同的代碼時,在最后一行得到一個InvalidProgramException
。
我當前正在做的事情是確定我正在處理的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.