2015-10-12 2 views
0

Я знаю атрибут CallerMemberName, который заменяет нулевой параметр, например, именем свойства, с которого вы вызываете метод.Есть ли атрибут CallingMemberName?

Это очень полезно для таких вещей, как PropertyChanged-Notifications. В настоящее время у нас есть другой сценарий, где мы хотели бы иметь атрибут parameter, который заменяет нулевой параметр именем метода, который вы вызываете.

Вообще-то, можно ли сделать что-то подобное? Честно говоря, я еще не имел дело с пользовательским атрибутом, но в нашем случае было бы любопытно иметь что-то вроде этого. Есть ли полезная информация, с которой я могу начать?

ответ

1

Там нет такого атрибута, но вы можете использовать C# 6 nameof оператора:

public void SomeMethod() 
{ 
    Console.WriteLine(nameof(SomeMethod)); 
} 

Конечно, это не динамически и автоматически вставляет имя методы вы находитесь, но требует, чтобы иметь фактическая ссылка на метод. Однако он поддерживает полный IntelliSense и также автоматически обновляется при реорганизации имени метода. И имя вставляется во время компиляции, так что вы не получите снижения производительности.

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

public void SomeMethod() 
{ 
    Console.WriteLine(GetMethodName()); 
} 

// assuming that a CallingMemberNameAttribute existed 
public string GetMethodName([CallingMemberName] string callingMember = null) 
{ 
    return callingMember; // would be always "GetMethodName" 
} 

Но вместо этого, вы можете использовать CallerMemberNameAttribute здесь снова, который затем корректно получит имя метода, вызывающего функцию GetMethodName:

public void SomeMethod() 
{ 
    Console.WriteLine(GetMethodName()); 
} 

public string GetMethodName([CallerMemberNamed] string callerMember = null) 
{ 
    return callerMember; 
} 
+0

Спасибо, что это хорошая идея в конце :) – Jannik

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