获取私有会员名称

时间:2016-06-04 01:22:44

标签: c#

所以我有这个。

private int _SomeDataBaseField_;
public int ID
{
    get { return _SomeDataBaseField_; }
    set { _SomeDataBaseField_ = value; }
}

我要做的是映射属性名称和私有字段名称,以便我可以仅使用属性名称提取私有字段名称,而不使用任何属性或标记。

所以我的问题是: 有没有办法只使用属性名称推断私有字段名称?像

这样的东西
string PrivateFieldName = typeof(T).GetProperty("ID").GetPrivateFieldName();

其中PrivateFieldName将是 SomeDataBaseField 。 我尝试使用反射,但没有运气..这是我得到的,它只显示私人字段类型(Int32),这是不是很有帮助。

foreach (PropertyInfo item in typeof(T).GetProperties())
{
    LocalVariableInfo lv = item.GetAccessors()[0].GetMethodBody().LocalVariables[0];
}

编辑:

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

改为使用typeof(T).GetFields

C#中的属性是两个CLR方法(getter和setter)的逻辑分组。属性不一定具有单个支持字段 - 它不必具有任何支持字段,或者它可以具有多个支持字段。你不应该做出这样的假设。

答案 1 :(得分:1)

并非每个属性都由单个字段支持 - 所有变体都是0-infinity,因此您需要查看目标是什么。

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

中找到

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

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

对于其他情况,通常有一些命名约定 - 即具有相同名称但不同的case / prefix / suffix的字段。基本字符串匹配对这种情况有帮助。