C# 如何将表达式从类型接口强制转换为特定类型

C# 如何将表达式从类型接口强制转换为特定类型,c#,interface,lambda,type-conversion,expression,C#,Interface,Lambda,Type Conversion,Expression,在我的界面中,我定义了以下内容 List<IFoo> GetListOfFoo<T>(Expression<Func<T, bool>> predicate) where T : IFoo; List getlistofoo(表达式谓词),其中T:IFoo; 在我的实现中,我将强制转换特定类型的表达式: if (typeof(T) == typeof(Foo)) { Expression converted = Expression.C

在我的界面中,我定义了以下内容

List<IFoo> GetListOfFoo<T>(Expression<Func<T, bool>> predicate) where T : IFoo;
List getlistofoo(表达式谓词),其中T:IFoo;
在我的实现中,我将强制转换特定类型的表达式:

if (typeof(T) == typeof(Foo))
{
    Expression converted = Expression.Convert(predicate.Body, typeof(Foo));
    Expression<Func<Foo, bool>> newPredicate = 
        Expression.Lambda<Func<Foo, bool>>(converted, predicate.Parameters);
}
if(typeof(T)=typeof(Foo))
{
Expression converted=Expression.Convert(predicate.Body,typeof(Foo));
表达式newPredicate=
表达式.Lambda(已转换,谓词.Parameters);
}
我尝试像这样使用我的实现:

Expression<Func<Foo, bool>> predicate = c => c.Name == "Myname";
_repository.GetListOfFoo<Foo>(predicate);
expressionpredicate=c=>c.Name==“Myname”;
_GetListOfFoo(谓词);
我没有得到编译错误,但是如果我使用它,我会得到一个异常,在ExpressionBody中定义了bool参数


我的问题在哪里?

您的代码没有任何意义

您正在创建一个
表达式。Convert
返回
Foo
,然后尝试将其用作返回
bool
的函数

表达式.Convert
也没有意义;不能将
bool
转换为
Foo

你可能想写点什么

var converted = (Expression<Func<Foo, bool>>) predicate;
var-converted=(表达式)谓词;

只要
T
Foo
,就可以正常工作。

您的代码没有任何意义

您正在创建一个
表达式。Convert
返回
Foo
,然后尝试将其用作返回
bool
的函数

表达式.Convert
也没有意义;不能将
bool
转换为
Foo

你可能想写点什么

var converted = (Expression<Func<Foo, bool>>) predicate;
var-converted=(表达式)谓词;

只要
T
Foo
,就可以正常工作。

参数的类型需要更改,而不是表达式的主体

在从实现调用时,必须进行转换


也不理解为什么需要它,因为参数的类型需要更改,而不是表达式的主体

在从实现调用时,必须进行转换


你为什么需要这个也没有意义,因为我找到了一个更好的解决方案。我不需要强制转换谓词本身

public List<IFoo> GetFoos<T>(Expression<Func<T, bool>> predicate) where T : class, IModel 
{
    var result = new List<IFoo>();
    var repository = new Repository<T>();
    result.AddRange(repository.GetEntities(predicate).ToList().ConvertAll(c => (IFoo)c));
    return result;
}
public List GetFoos(表达式谓词),其中T:class,IModel
{
var result=新列表();
var repository=新存储库();
AddRange(repository.GetEntities(谓词).ToList().ConvertAll(c=>(IFoo)c));
返回结果;
}

我找到了一个更好的解决方案。我不需要强制转换谓词本身

public List<IFoo> GetFoos<T>(Expression<Func<T, bool>> predicate) where T : class, IModel 
{
    var result = new List<IFoo>();
    var repository = new Repository<T>();
    result.AddRange(repository.GetEntities(predicate).ToList().ConvertAll(c => (IFoo)c));
    return result;
}
public List GetFoos(表达式谓词),其中T:class,IModel
{
var result=新列表();
var repository=新存储库();
AddRange(repository.GetEntities(谓词).ToList().ConvertAll(c=>(IFoo)c));
返回结果;
}

异常具体说明了什么?@SLaks-它抛出异常而不是错误。请发布更多详细信息Mario。由于您的where子句,不需要类型检查的if。异常具体说明了什么?@SLaks-它会引发异常,而不是错误。请发布更多详细信息Mario。不需要类型检查的if,因为您的where clauseThanks需要您的答案。我不想将bool转换为Foo,而是将Foo转换为IFoo中的Foo,因为Foo实现了IFoo。在我的进一步的Methodbody中,我使用接口。换句话说,您希望遍历表达式树,并用转换替换对参数的任何引用。你需要写一个ExpressionVisitor。谢谢你的回答。我不想将bool转换为Foo,而是将Foo转换为IFoo中的Foo,因为Foo实现了IFoo。在我的进一步的Methodbody中,我使用接口。换句话说,您希望遍历表达式树,并用转换替换对参数的任何引用。你需要写一个ExpressionVisitor。