C# 通过表达式获取/设置属性
试图通过将oracle数据库中的字段映射到对象上的属性来创建数据访问组件。我已经创建了一个基本对象,它的类型如下所示C# 通过表达式获取/设置属性,c#,lambda,C#,Lambda,试图通过将oracle数据库中的字段映射到对象上的属性来创建数据访问组件。我已经创建了一个基本对象,它的类型如下所示 public class Document : DataProviderBase<DataObjects.Document> { // code goes here... } this.AddMapping<int>("ATD_KEY", "Key") 在这种情况下 int是属性的类型 ATD_KEY是数据库中的字段名 键是数据对象上的
public class Document : DataProviderBase<DataObjects.Document>
{
// code goes here...
}
this.AddMapping<int>("ATD_KEY", "Key")
在这种情况下
是属性的类型int
是数据库中的字段名ATD_KEY
是键
数据对象上的属性名称。文档
typeof(<TParent>).GetProperty(<property name>)
…其中,o
是由DataProviderBase
提供的类型。这将确保属性Key
实际上是int
类型,并确保字符串“Key”
没有拼写错误或大小写错误,就像第一个AddMapping
方法中显示的当前工作代码的问题一样
这可能吗?如果是,怎么做
我发现的最接近的例子是
,但这仍然是按字符串而不是按表达式引用属性。您可以使用以下内容:
public void AddMapping<T>(fieldName, Expression<Func<TParent, T>> propExpr)
{
var memberExpr = (MemberExpression)propExpr.Body;
PropertyInfo property = (PropertyInfo)memberExpr.Member;
...
}
public void AddMapping(字段名、表达式propExpr)
{
var memberExpr=(MemberExpression)propExpr.Body;
PropertyInfo属性=(PropertyInfo)memberExpr.Member;
...
}
确保有可能:
public static PropertyInfo GetProperty<TParent>(Expression<Func<TParent, object>> prop)
{
var expr = prop.Body;
if (expr.NodeType == ExpressionType.Convert)
expr = ((UnaryExpression)expr).Operand;
if (expr.NodeType == ExpressionType.MemberAccess)
return ((MemberExpression)expr).Member as PropertyInfo;
throw new ArgumentException("Invalid lambda", "prop");
}
public void AddMapping<TParent>(fieldName, Expression<Func<TParent, object>> prop)
{
AddMapping(fieldName, GetProperty(prop).Name);
}
publicstaticpropertyinfo GetProperty(expressionprop)
{
var expr=道具主体;
if(expr.NodeType==ExpressionType.Convert)
expr=((一元表达式)expr);
if(expr.NodeType==ExpressionType.MemberAccess)
返回((MemberExpression)expr).Member作为PropertyInfo;
抛出新ArgumentException(“无效lambda”、“prop”);
}
public void AddMapping(字段名、表达式属性)
{
AddMapping(字段名,GetProperty(prop).Name);
}
此方法的优点是只需要一个类型参数(
TParent
)。传入的lambda可能包含对属性类型的强制转换。我们先把它去掉,然后再得到成员表达式。现在还不清楚您想要达到什么目的:请您澄清您的问题以及预期解决方案的任何实际优点,好吗?感谢和问候,这里的目标是类型安全。上一个方法中的属性名称始终拼写错误,并导致错误。这有用吗?
public static PropertyInfo GetProperty<TParent>(Expression<Func<TParent, object>> prop)
{
var expr = prop.Body;
if (expr.NodeType == ExpressionType.Convert)
expr = ((UnaryExpression)expr).Operand;
if (expr.NodeType == ExpressionType.MemberAccess)
return ((MemberExpression)expr).Member as PropertyInfo;
throw new ArgumentException("Invalid lambda", "prop");
}
public void AddMapping<TParent>(fieldName, Expression<Func<TParent, object>> prop)
{
AddMapping(fieldName, GetProperty(prop).Name);
}