首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取属性私有成员名

问获取属性私有成员名
EN

Stack Overflow用户
提问于 2016-06-04 01:22:44
回答 2查看 109关注 0票数 0

所以我有这个。

代码语言:javascript
复制
private int _SomeDataBaseField_;
public int ID
{
    get { return _SomeDataBaseField_; }
    set { _SomeDataBaseField_ = value; }
}

我想要做的是映射属性名和私有字段名,这样我就可以使用属性名来提取私有字段名,而不需要使用任何属性或标记。

因此,我的问题是:是否有任何方法可以仅使用属性名来推断私有字段名?有点像

代码语言:javascript
复制
string PrivateFieldName = typeof(T).GetProperty("ID").GetPrivateFieldName();

在那里PrivateFieldName将是SomeDataBaseField。我试着使用反射,但没有运气。这是我所得到的,它只显示了私有字段类型(Int32),这不是很有帮助。

代码语言:javascript
复制
foreach (PropertyInfo item in typeof(T).GetProperties())
{
    LocalVariableInfo lv = item.GetAccessors()[0].GetMethodBody().LocalVariables[0];
}

编辑:

我觉得我需要解释为什么我需要这个。所以我有一个包含1200+属性的类,它们都有私有字段(后台字段)。现在,我已经花了无数个小时为该类创建mysql数据库表,现在我使用它,我意识到每次需要更新数据库中的一个字段时,我都必须手动键入字段名。因此,我想我应该使用私有字段名作为数据库列,然后提供带有属性名称的update函数,然后该属性名称将查找相应的私有字段名的<'PropertName,PrivateName'>集合,并将其用作数据库字段名。这不仅会节省时间,而且还将限制每当需要更新或解析字段名时反复输入字段名的需要。

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-06-04 01:36:35

使用typeof(T).GetFields代替。

C#中的属性是两个CLR方法( getter和setter)的逻辑分组。一个属性不一定有一个支持字段--它不需要有任何支持字段,也可以有多个支持字段。你不应该做那种假设。

票数 2
EN

Stack Overflow用户

发布于 2016-06-04 01:41:51

并不是每个属性都有一个字段支持--所有的变体0-无穷大都是可能的,所以您需要检查您的目标是什么。

正确的方法是解析每个属性的IL获取/设置对,并找到它们正在使用的打包字段(如果有的话)。这种方法将允许您检测使用多个支持字段(或根本不使用支持字段)的重要属性。GetMethodBody是这类代码的起点--一些信息可以在Can I use reflection to inspect the code in a method?中找到。

更实际的方法是依靠某种约定来寻找匹配。

也就是说,对于自动属性,编译器生成可预测的名称(依赖于实现),您可以找到匹配字段,如Is it possible to access backing fields behind auto-implemented properties?所示。

对于其他情况,通常有一些命名约定--即名称相同但大小写/前缀/后缀不同的字段。在这种情况下,基本的字符串匹配会有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37625459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档