所以我有这个。
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数据库表,现在我使用它,我意识到每次需要更新数据库中的一个字段时,我都必须手动键入字段名。因此,我想我应该使用私有字段名作为数据库列,然后提供带有属性名称的update函数,然后该属性名称将查找相应的私有字段名的<'PropertName,PrivateName'>集合,并将其用作数据库字段名。这不仅会节省时间,而且还将限制每当需要更新或解析字段名时反复输入字段名的需要。
提前谢谢。
发布于 2016-06-04 01:36:35
使用typeof(T).GetFields代替。
C#中的属性是两个CLR方法( getter和setter)的逻辑分组。一个属性不一定有一个支持字段--它不需要有任何支持字段,也可以有多个支持字段。你不应该做那种假设。
发布于 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?所示。
对于其他情况,通常有一些命名约定--即名称相同但大小写/前缀/后缀不同的字段。在这种情况下,基本的字符串匹配会有所帮助。
https://stackoverflow.com/questions/37625459
复制相似问题