【问题标题】:Get the Propertyname on owning type c#获取拥有类型 c# 的 Propertyname
【发布时间】:2011-05-17 10:49:18
【问题描述】:

我有以下构造:

class Bla
{
    public string Hello()
    {
        return "Hello my name is " + GetMyVariableName();

    }

    private string GetMyVariableName()
    {
        return "";//do magic here to determine the Variable name at the class that owns the Property
    }
}

class Fasel
{
    public Bla SomeProperty { get; set; }
    public Bla AnotherProperty { get; set; }

    void DoSomeAction()
    {
        SomeProperty = new Bla();
        AnotherProperty = new Bla();

        string name = SomeProperty.Hello(); //this sould return "Hello my name is SomeProperty"

        name = AnotherProperty.Hello(); ////this sould return "Hello my name is AnotherProperty"
    }
}

这看起来很容易解决,因为我只是通过反射来确定拥有类的名称,但在我的特殊情况下,我不能这样做。我需要在 Property 中知道它在拥有它的类中的名称是什么。

【问题讨论】:

  • 如果不创建自己的 CLR 版本,您将无法执行此操作。

标签: c# reflection properties


【解决方案1】:

这完全不可能。

一个实例可以被多个属性引用;对象和它所引用的属性之间没有联系。 (GC除外,它不会告诉你)

此外,JIT 内联可能意味着根本不需要涉及该属性。
此外,优化的二进制文件中不存在局部变量名称。

【讨论】:

  • 不是不可能,只是真的真的很难。您可以使用 Stack Trace 获取调用 Hello 的方法。然后使用方法体来弄清楚。尽管即使从那里我也看不到一个好的方法。但出于所有意图和目的,您的答案是正确的。
  • @Yuriy:不;这真的是不可能的。您无法可靠地确定您的调用源自非平凡方法的方法中的哪个位置。 (除非您复制 JITter,或者创建第二个进程并将其作为托管调试器附加到第一个进程,这两者都是疯狂且不可能的)
  • 您的问题意味着您的设计存在严重错误,但如果您只需要支持属性(而不是局部变量)应该是可能的。您可以查看堆栈跟踪以找到其方法正在调用 Bla.Hello() 的对象,然后使用反射遍历该对象的所有属性和字段,并找到其值为 Bla 实例的对象。
  • @Ran:那也行不通。如果两个属性指向同一个实例怎么办? 如果方法使用来自不同实例的属性怎么办?
【解决方案2】:

我认为您的要求是不可能的。也许一种方法是让 Bla 的构造函数接受一个字符串,然后当你创建实例时,你可以传入字符串:

SomeProperty = new Bla("SomeProperty");
AnotherProperty = new Bla("AnotherProperty");

【讨论】:

  • 这是当前的解决方案,但如果有人重命名属性并忘记了构造函数,则背后的逻辑将失败,但编译器无法检查。
【解决方案3】:

您无法通过反射可靠地做到这一点,而且一开始就想要这样做是一个糟糕的主意。可以在实例上调用方法,而无需为其声明变量。例如:

string name=new Bla().Hello();

在这种情况下,您的方法会打印什么......?

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多