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