[英]c# 6.0 and reflection, getting value of Property Initializers
我一直試圖嘗試反思,我有一個問題。
假設我有一個類,在這個類中我有一個屬性,使用c#6.0的新功能進行了初始化
Class MyClass()
{
public string SomeProperty{ get; set; } = "SomeValue";
}
有沒有辦法通過反思獲得這個價值,而無需啟動課程?
我知道我能做到這一點;
var foo= new MyClass();
var value = foo.GetType().GetProperty("SomeProperty").GetValue(foo);
但我想做的是與此類似的事情;
typeof(MyClass).GetProperty("SomeProperty").GetValue();
我知道我可以用一個字段來獲取價值。 但它需要是一個財產。
謝謝。
這只是一種語法糖。 這個:
class MyClass()
{
public string SomeProperty{ get; set; } = "SomeValue";
}
將被編譯器打包到:
class MyClass()
{
public MyClass()
{
_someProperty = "SomeValue";
}
// actually, backing field name will be different,
// but it doesn't matter for this question
private string _someProperty;
public string SomeProperty
{
get { return _someProperty; }
set { _someProperty = value; }
}
}
反思是關於元數據。 metatada中沒有任何“SomeValue”存儲。 您所能做的就是以常規方式閱讀房產價值。
我知道我可以用一個字段來獲取價值
如果不實例化對象,則只能獲取靜態字段的值。
要獲取實例字段的值,顯然需要一個對象實例。
或者,如果您需要在反射元數據中使用屬性的默認值,則可以使用屬性(System.ComponentModel中的一個屬性)執行工作:DefaultValue。 例如:
using System.ComponentModel;
class MyClass()
{
[DefaultValue("SomeValue")]
public string SomeProperty{ get; set; } = "SomeValue";
}
//
var propertyInfo = typeof(MyClass).GetProperty("SomeProperty");
var defaultValue = (DefaultValue)Attribute.GetCustomeAttribute(propertyInfo, typeof(DefaultValue));
var value = defaultValue.Value;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.