C#如何获取正在设置的属性的名称
发布时间:2020-12-15 08:23:37 所属栏目:百科 来源:网络整理
导读:我有一个数据库对象类,做了一堆繁重的工作.然后,我扩展该对象并构建表示要修改的实际对象和字段的类.它基本上看起来像这样: public class MyObject : DatabaSEObject{ public string FieldX { get { return GetValuestring("FieldX"); } set { SetValuestri
我有一个数据库对象类,做了一堆繁重的工作.然后,我扩展该对象并构建表示要修改的实际对象和字段的类.它基本上看起来像这样:
public class MyObject : DatabaSEObject { public string FieldX { get { return GetValue<string>("FieldX"); } set { SetValue<string>("FieldX",value); } } public int FieldY { get { return GetValue<int>("FieldY"); } set { SetValue<int>("FieldY",value); } } } public class DatabaSEObject { public T GetValue<T>(string FieldName) { // Code that actually gets the right value } public void SetValue<T>(string FieldName,T value) { // Code that actually sets the value in the right place } } 这样,我以后可以实例化MyObject并开始通过代码设置属性.我们的想法是生成更简单,更易于维护的代码. 它在实践中很有效.但是,我注意到MyObject的代码非常重复.例如,使用FieldX,我最终在get / set中指定了“string”类型,并且还必须在get / set中指定属性名称“FieldX”. 我想知道是否有办法进一步简化代码以减少重复. 我知道我可以使用反射: MethodBase.GetCurrentMethod().Name.Substring(4) …在get / set调用中获取属性名称,我可以使用GetType()来获取set时的值类型,但理想情况下我想从基本GetValue /中获取原始属性名称SetValue方法(理想情况下不解析堆栈跟踪). 理想情况下,我正在寻找这样的东西: public string FieldX { get { return GetValue(); } set { SetValue(value); } } public int FieldY { get { return GetValue(); } set { SetValue(value); } } 有什么想法吗? 解决方法
这比你想要的要长一些,但也可以使用(使用强类型的lambda表达式).
public class MyObject : DatabaSEObject { public string FieldX { get { return GetValue(() => FieldX); } set { SetValue(() => FieldX,value); } } public int FieldY { get { return GetValue(() => FieldY); } set { SetValue(() => FieldY,value); } } } public class DatabaSEObject { public T GetValue<T>(Expression<Func<T>> field) { string fieldName = GetFieldName(field); // Code that actually gets the right value } public void SetValue<T>(Expression<Func<T>> field,T value) { string fieldName = GetFieldName(field); // Code that actually sets the value in the right place } private static string GetFieldName<T>(Expression<Func<T>> field) { return ((MemberExpression)field.Body).Member.Name; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |