c# - 如何使用反射在 C# 中获取自动属性的默认值?

标签 c# .net reflection

所以我有这门课

public class MyClass
{
    public int Id {get; set;} = 5
}

使用反射如何得到 5

我试图避免创建 MyClass 的实例。这似乎是不必要的。

编辑:它叫做“Auto-Property Initializer”值

来自:http://geekswithblogs.net/WinAZ/archive/2015/06/30/whatrsquos-new-in-c-6.0-auto-property-initializers.aspx

最佳答案

那个类实际上编译成这个:

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;
}

话虽如此,这里有一个小LINQPad演示 Mono.Cecil 的程序:

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

所以它可能可行在这种情况下,但是其他类型的常量,等等,比如对静态方法的调用,将不容易处理。

简而言之,创建实例!

关于c# - 如何使用反射在 C# 中获取自动属性的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48190013/

相关文章:

c# - 为什么在此 MethodInfo 上找不到自定义属性

c# - 游戏对象相对于父对象不在同一位置

c# - 如何将对象列表存储到 ViewState

c# - 从 cultureCode 获取文化名称

c# - 动态编译代码时出现IOException

c# - 执行一个命令直到另一个命令完成

c# - 用c#卡住excel列

.net - 使用 Newtonsoft.Json 解析 json 时出现 RuntimeBinderException

python - 获取python函数的参数顺序?

C# MVC - 根据模型动态获取属性名称