簡體   English   中英

c#6.0和反射,獲得Property Initializers的值

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

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