2015-03-22 4 views
1

Есть ли способ получить авто ссылку на функцию-член или свойство в C#?Получение ссылки на «thismember» в C#

Я имею в виду что-то вроде этого:

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

И 'thismember' является то, что автоматически ссылается на вызывающий свойство ('MyProp'), типа System.Reflection.PropertyInfo или System.Reflection.MemberInfo?

ответ

1

Нет, такого не бывает.

То, что обсуждалось (но отброшено пока, поскольку это было бы очень сложно), является infoof operator. Такой оператор может вернуть MemberInfo для члена, переданного оператору.

Ближайшая вещь к тому, что вы ищете, может быть наступающим nameof operator от C# 6.0. Хотя вам все еще нужно явно указывать имя участника, вы, по крайней мере, должны будете проверять время членства в компиляции, поэтому, если вы реорганизуете своего члена, переименовав его, компилятор предупредит вас, что вам также нужно указать новое имя, где вы вызываете оператора nameof.

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

Я думаю, вы хотите как-то автоматически вызвать метод 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, который может быть полезен. Однако я не уверен, каковы ваши намерения, поэтому он может не соответствовать вашим потребностям.

Смежные вопросы