也許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)
我不能在Foo中的方法進行修改,我的問題是關於什麼應該Foo_method之前,這就是爲什麼我給那個方法名Foo_method –
好一點,其實你可以只創建'Foo_Method'過載,或者只是使用該技術創建一個完整的不同方法來提取屬性名稱。 – sloth
退回無效。它應該是字符串。 –