2013-06-23 6 views
-1

У меня есть свойство, называемое MyProperty. Мне интересно получить ссылку на объект, который называется установщиком свойства. Например:получить модификатор установленного свойства

MyProperty 
{ 
    set 
    { 
    if (modifer.GetType() == typeof(UIControl)) 
    { 
     //some code 
    } 
    else 
    { 
     //some code 
    } 
    } 
} 
+0

Что такое 'modifier', и что это, что вы думаете, это проблема с кодом ? – Guffa

+5

Здесь вы останавливаете использование свойства и используете метод вместо этого. С аргументом. –

ответ

0

Я не думаю, что это возможно, если вы не разматываете стопку? Что бы вы могли сделать, но я бы не рекомендовал его.

+0

Интересно, как вы разматываете стек в коде? Не удалось ли исключить и ожидать возврата метода? –

+0

@LewsTherin Я думаю, что он говорит о http://msdn.microsoft.com/library/system.diagnostics.stacktrace.aspx – hangy

+0

@hangy Я вижу, спасибо. –

0

Вы можете использовать отражение. Хотя этот подход не то, что я бы рекомендовал.

StackTrace stackTrace = new StackTrace(); 
var modifier = stackTrace.GetFrame(1).GetType(); 

if (modifier == typeof(UIControl)) 
{ 
    //some code 
} 

Я не проверял это, но должен быть прав.

Вы также можете проверить CallerMemberNameAttribute, это может быть актуально для вас.

0

Можно проверить текущий стек во время выполнения. Это позволит вам проверить класс вызывающего метода:

StackTrace stackTrace = new StackTrace(); 
var callingMethod = stackTrace.GetFrame(1).GetMethod(); 
var callingType = callingMethod.ReflectedType 
//Or possible callingMethod.DeclaringType, depending on need 

Однако этот тип кода должен содержать аварийные сигналы. Использование отражения для размотки стека является хрупким, неинтуитивным и бросает вызов separation of concerns. Установителем свойства является абстракция, предназначенная для установки значения, дающего ничего, кроме установленного значения.

Существует несколько более сильных альтернатив. Среди них, рассмотреть наличие метода, называемого только UIControls:

public void SetMyPropertyFromUiControl(MyType value) 
{ 
    this.MyProperty = value; 
    ... other logic concerning UIControl 
} 

Если детали экземпляра UIControl используется для установки свойства имеют важное значение, метод подписи может выглядеть следующим образом:

public void SetMyPropertyFromUiControl(MyType value, UIControl control) 
{ 
    this.MyProperty = value; 
    ... other logic concerning UIControl that uses the control parameter 
} 
+0

Метод reflecion не будет работать, если вызов свойства был встроен. В этом случае вы можете получить вызывающего абонента вашего метода вызова и ввести его обратно. Но он отлично работает внутри отладчика, потому что оптимизация JIT обычно отключается при отладке. –

+0

@AloisKraus Хорошая точка! Другая причина, по которой такой подход является слабым. –

0

На самом деле в .NET 4.5 появилась новая функция, которая называется «Информация о вызывающем абоненте».

Вы можете получить некоторую информацию о вызывающей подобное:

public Employee([CallerMemberName]string sourceMemberName = "", 
       [CallerFilePath]string sourceFilePath = "", 
       [CallerLineNumber]int sourceLineNo = 0) 
{ 
    Debug.WriteLine("Member Name : " + sourceMemberName); 
    Debug.WriteLine("File Name : " + sourceFilePath); 
    Debug.WriteLine("Line No. : " + sourceLineNo); 
} 


Дополнительная информация: Caller Info - codeguru.com