Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过表达式获取/设置属性_C#_Lambda - Fatal编程技术网

C# 通过表达式获取/设置属性

C# 通过表达式获取/设置属性,c#,lambda,C#,Lambda,试图通过将oracle数据库中的字段映射到对象上的属性来创建数据访问组件。我已经创建了一个基本对象,它的类型如下所示 public class Document : DataProviderBase<DataObjects.Document> { // code goes here... } this.AddMapping<int>("ATD_KEY", "Key") 在这种情况下 int是属性的类型 ATD_KEY是数据库中的字段名 键是数据对象上的

试图通过将oracle数据库中的字段映射到对象上的属性来创建数据访问组件。我已经创建了一个基本对象,它的类型如下所示

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);
}