在C#中获取对“thismember”的引用

时间:2015-03-22 17:24:49

标签: c# reflection

有没有办法在c#中获得对成员函数或属性的自动引用?

我的意思是这样的:

class Foo {
    bool prop;
    public bool MyProp
    {
        get { return prop; }
        set {
            prop = value;
            OnPropertyChanged(thismember);
        }
    }
}

' thismember'是一种自动引用类型为System.Reflection.PropertyInfo或System.Reflection.MemberInfo的调用属性(' MyProp')?

4 个答案:

答案 0 :(得分:2)

接近你想要的东西是棱镜的BindableBase:

protected virtual bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
  if (object.Equals((object) storage, (object) value))
    return false;
  storage = value;
  this.OnPropertyChanged(propertyName);
  return true;
}

它允许你这样做:

public bool MyProp
{
    get { return prop; }
    set {
        SetProperty(ref prop, value);
    }
}

你的viewmodel当然需要从bindablebase派生。

答案 1 :(得分:1)

目前,没有。但考虑到您的示例,C#6会对您有所帮助,因为nameof运营商即将到来,请在此处查看https://msdn.microsoft.com/en-us/magazine/dn802602.aspxhttps://roslyn.codeplex.com/discussions/570551

答案 2 :(得分:1)

不,没有这样的事情。

已讨论过的内容(暂时被丢弃,因为它非常复杂)是infoof operator。这样的运算符可以返回传递给运算符的成员的MemberInfo

与您正在寻找的最接近的可能是来自C#6.0的即将到来的nameof operator。虽然您仍然必须明确说明成员名称,但您至少会对成员名称进行编译时检查,因此如果您通过重命名重构您的成员,编译器将提醒您还需要指定新名称你调用nameof运算符。

答案 3 :(得分:1)

我想你想以某种方式自动调用OnPropertyChanged方法而不指定它所称的特定属性。很难,但你可以尝试另一种方式......

public class SomeClasss
{
    public string Name { get; set; }

    bool _prop;
    public bool MyProp
    {
        get { return _prop; }
        set
        {
            _prop = value;
            //OnPropertyChanged(thismember);
            MethodBase method = System.Reflection.MethodBase.GetCurrentMethod();
            string methodName = method.Name;
            string className = method.ReflectedType.Name;
            Name = className + "." + methodName;
        }
    }        
}

主要......

class Program
{
    static void Main()
    {
        SomeClasss c = new SomeClasss();
        Console.WriteLine("Before: {0}", c.Name);
        c.MyProp = true;
        Console.WriteLine("After: {0}", c.Name);
        Console.ReadKey();
    }
}

结果:

  

之前:

     

之后:SomeClasss.set_MyProp

使用显示的代码,您可以将属性名称传递给OnPropertyChanged方法,这可能会有所帮助。但是,我不确定您的意图是什么,因此可能无法完全满足您的需求。