【问题标题】:c# 6.0 and reflection, getting value of Property Initializersc# 6.0和反射,获取Property Initializers的值
【发布时间】:2015-10-28 06:04:59
【问题描述】:

我一直在尝试使用反射进行实验,但我有一个问题。

假设我有一个类,在这个类中我有一个使用 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();

我知道我可以使用字段来获取值。但它必须是一个财产。

谢谢。

【问题讨论】:

  • AFAIK 除非类被实例化并分配内存并且其字段已初始化,否则您无法获取该值。作为对这一点的交叉检查,迄今为止已知的大多数反射方法都有一个实例/对象作为参数。
  • 我认为这是不可能的,因为属性和类不是静态的。要访问该属性,您必须有一个可用的有效对象(在内存中有引用)。
  • 作为回复状态,除非类对象被初始化,否则内存中没有字符串对象存储分配给它的值。您将需要创建一个实例来获取字符串对象和分配给它的值。
  • 你可以通过 IL 解析而不是反射获得SomeValue。搜索MethodBase.GetMethodBody 了解更多信息。这不是一件容易的事,但使用适当的工具/库,它仍然可以实现。

标签: c# .net reflection c#-6.0


【解决方案1】:

这只是一个语法糖。 这个:

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

反射是关于元数据的。元数据中没有存储任何“SomeValue”。您所能做的就是以常规方式读取属性值。

我知道我可以使用字段来获取值

无需实例化对象,您只能获取静态字段的值。
要获取实例字段的值,您显然需要一个对象实例。

【讨论】:

  • 哦,我明白了。谢谢。
【解决方案2】:

或者,如果您需要反射元数据中属性的默认值,您可以使用属性,它来自 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;

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多