2012-09-10 20 views
2

我正在調用屬性的方法。我必須傳遞屬性名稱作爲該方法的屬性。我的屬性是從反射或硬編碼字符串中提取方法名稱作爲字符串?

string lcl_name = string.Empty; 

public string Name 
{ 
get { return lcl_name; } 
set 
    { 
     if (lcl_name != value) 
     { 
      lcl_name = value; 
      Foo_Method(GetCorrectPropertyName(MethodBase.GetCurrentMethod().Name)); 
     } 
} 
} 

和方法是

public string GetCorrectPropertyName(string propertyName) 
{ 
    return propertyName.StartsWith("set_") || propertyName.StartsWith("get_") ? 
      propertyName.Substring(4) : string.Empty; 
} 

我的學長說,我不應該叫反思,並通過直接串法這樣

Foo_Method("Name"); 

但在這種情況下,由於它將被硬編碼並且如果屬性名稱被改變,則方法調用必須相應地改變。

所以我的問題是哪一個在效率方面會更好?還有什麼我的老人看到我不知道的東西嗎?

回答

2

也許Expression Trees可以幫助你在這裏。

而不是Foo_Method取屬性名作爲字符串

void Foo_Method(string name) 
{ 

} 

使用Expression類型的參數通過MemberExpression要檢索的屬性名稱:

void Foo_Method(Expression<Func<NameOfYourClass, String>> exp) 
{ 
    var propertyName = ((MemberExpression)exp.Body).Member.Name; 
} 

,並調用它

public string Name 
{ 
    get { return lcl_name; } 
    set 
    { 
     if (lcl_name != value) 
     { 
      lcl_name = value; 
      // Foo_Method("Foo"); string is bad 
      Foo_Method(x => x.Name); 
     } 
    } 
} 

這樣,當重命名Name,您不會破壞您的代碼,因爲Foo_Method(x => x.Name)也會被重命名(當然,當您使用IDE重構功能進行重命名時)。


編輯:

爲了回答您的評論:

如果你真的不能添加超載Foo_Method,當然你也可以只創建另一種方法:

if (lcl_name != value) 
{ 
    lcl_name = value; 
    Foo_Method(GetPropName(x => x.Name)); 
} 

... 

string GetPropName(Expression<Func<NameOfYourClass, String>> exp) 
{ 
    return ((MemberExpression)exp.Body).Member.Name; 
} 

編輯2:

爲了回答您的其他評論:

您可以創建一個擴展方法

public static class Extensions 
{ 
    public static string GetPropName<T>(this T t, Expression<Func<T, String>> exp) 
    { 
     return ((MemberExpression)exp.Body).Member.Name; 
    } 
} 

var propertyName = yourInstace.GetPropName(y => y.Name); 

,但你不必,因爲沒有表達任何情況下正常工作。

public static class Extensions 
{ 
    public static string GetPropName<T>(Expression<Func<T, String>> exp) 
    { 
     return ((MemberExpression)exp.Body).Member.Name; 
    } 
} 

var propertyName = Extensions.GetPropName<YourClass>(y => y.Name); 

訣竅是在這裏使用泛型。


第一種方法在VB中看起來像這樣。淨

Public Function GetPropName(Of TClass, TProperty)(exp As Expression(Of Func(Of TClass, TProperty))) as String 
    Return DirectCast(exp.Body, MemberExpression).Member.Name 
End Function 

... 

GetPropName(Function(x) x.Name) 
+0

我不能在Foo中的方法進行修改,我的問題是關於什麼應該Foo_method之前,這就是爲什麼我給那個方法名Foo_method –

+0

好一點,其實你可以只創建'Foo_Method'過載,或者只是使用該技術創建一個完整的不同方法來提取屬性名稱。 – sloth

+0

退回無效。它應該是字符串。 –

相關問題