C#-将方法扩展与Expression.Property()一起使用

C#-将方法扩展与Expression.Property()一起使用,c#,expression,C#,Expression,我正在尝试使用方法扩展构建一个表达式。不幸的是,这似乎无法直接实现。下面的代码示例给出了一个未找到的方法异常 有人知道如何在extension.Property方法中使用方法扩展吗 public class Program { static void Main(string[] args) { var obj = new TestProperty(); var propertyExpr2 = Expression.Property(Expressi

我正在尝试使用方法扩展构建一个表达式。不幸的是,这似乎无法直接实现。下面的代码示例给出了一个未找到的方法异常

有人知道如何在extension.Property方法中使用方法扩展吗

public class Program
{
    static void Main(string[] args)
    {
        var obj = new TestProperty();
        var propertyExpr2 = Expression.Property(Expression.Constant(obj), "Sample");
        propertyExpr2 = Expression.Property(propertyExpr2, "GetValueOrDefault");

        Console.WriteLine(Expression.Lambda<Func<string>>(propertyExpr2).Compile()());
        Console.ReadLine();
    }
}

public static class StringExtension
{
    public static string GetValueOrDefault(this string s)
    {
        return s ?? "Testing";
    }
}

public class TestProperty
{
    public string Sample { get; set; }
}
公共类程序
{
静态void Main(字符串[]参数)
{
var obj=新的TestProperty();
var propertyExpr2=Expression.Property(Expression.Constant(obj),“Sample”);
propertyExpr2=Expression.Property(propertyExpr2,“GetValueOrDefault”);
WriteLine(Expression.Lambda(propertyExpr2.Compile());
Console.ReadLine();
}
}
公共静态类扩展
{
公共静态字符串GetValuerDefault(此字符串为s)
{
返回“测试”;
}
}
公共类TestProperty
{
公共字符串样本{get;set;}
}

谢谢

据猜测,您的问题是
GetValueOrDefault
不是一个属性,因此
Expression.property
显然不起作用。从2秒钟的谷歌搜索中,我猜您需要表示方法调用的
Expression.Call
()。我要补充的是,您可以让编译器生成表达式,然后在调试器中对其进行分析:
Expression=()=>obj.Sample.GetValueOrDefault()
谢谢大家,
Expression.Call
显然是正确的解决方案!似乎方法扩展把我弄糊涂了<代码>var ex1=Expression.Property(Expression.Constant(obj),“Sample”);var ex2=Expression.Call(typeof(StringExtension).GetMethod(“GetValueOrDefault”),ex1,Expression.Constant(“Testing”);WriteLine(Expression.Lambda(ex2.Compile())