[英]How to get default value of auto property in C# using reflection?
所以我有這門課
public class MyClass
{
public int Id {get; set;} = 5
}
使用反射如何獲得5
?
我試圖避免創建 MyClass 的實例。 似乎沒有必要。
編輯:它被稱為“Auto-Property Initializer”值
該類實際上被編譯成這樣:
public class MyClass
{
private int MyClass___1<Id> = 5;
public int Id
{
get { return MyClass___1<Id>; }
set { MyClass___1<Id> = value; }
}
}
這又相當於:
public class MyClass
{
private int MyClass___1<Id>;
public MyClass()
{
MyClass___1<Id> = 5;
}
public int Id
{
get { return MyClass___1<Id>; }
set { MyClass___1<Id> = value; }
}
}
因此,除了反編譯構造函數或構造該類型的實例之外,您無法獲得該值。
如果您是該類型的作者,最好的方法是將[DefaultValue(...)]
屬性應用於屬性,該屬性可以通過反射讀取。 許多序列化庫也將使用此值,以避免序列化具有默認值的屬性。
您的課程將如下所示:
public class MyClass
{
[DefaultValue(5)]
public int Id { get; set; } = 5;
}
話雖如此,這是一個演示Mono.Cecil的小型LINQPad程序:
void Main()
{
var assembly = AssemblyDefinition.ReadAssembly(GetType().Assembly.Location);
var myClassType =
(from module in assembly.Modules
from type in module.Types
where type.Name == "UserQuery"
from nestedType in type.NestedTypes
where nestedType.Name == "MyClass"
select nestedType).FirstOrDefault();
var ctor =
(from method in myClassType.Methods
where method.IsConstructor
select method).FirstOrDefault();
foreach (var instruction in ctor.Body.Instructions)
Console.WriteLine(instruction.ToString());
}
public class MyClass
{
public int Id { get; set; } = 5;
}
輸出:
IL_0000: ldarg.0
IL_0001: ldc.i4.5
IL_0002: stfld System.Int32 UserQuery/MyClass::<Id>k__BackingField
IL_0007: ldarg.0
IL_0008: call System.Void System.Object::.ctor()
IL_000d: ret
所以在這種情況下可能是可行的,但是其他類型的常量等等,比如對靜態方法的調用,就不容易處理了。
簡而言之,創建實例!
我試圖避免創建 MyClass 的實例。 似乎沒有必要。
實際上並非如此。 如果不調用構造函數,就不會初始化變量Id
。 但更重要的是,沒有實例就不會分配內存,因此您將無法獲得任何價值。
使用反射如何獲得 5 ?
但是,如果您確實創建了一個實例,則可以通過以下方式獲取它:
Console.WriteLine(typeof(MyClass).GetProperty("Id").GetValue(new MyClass()));
我嘗試使用反射創建新實例並在“GetValue”中提供一種實例類,它成功了!
像這樣的例子:
var myClassType = MyClass.GetType();
var instance = Activator.CreateInstance(myClassType);
var latestInput = MyClass.GetType().GetProperty(input.Name).GetValue(instance);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.