gpt4 book ai didi

c# - 将成员访问函数从 Func 转换为 Func

转载 作者:行者123 更新时间:2023-11-30 21:09:05 31 4
gpt4 key购买 nike

我正在尝试使用流畅的 nhibernate 创建动态基础映射。

我正在做的是通过 BaseMap< T > : ClassMap< T > checkin ,例如: (类型(ICategorizedEntity).IsAssignableFrom(类型(T)))

如果是这样,我想映射一个名为“Category”的属性,它属于 ICategorizedEntity 的接口(interface),但是 Map(Func) 函数只接受 T 的属性,所以我试着用 linq 猜测了一下并想出了这个:

   Expression<Func<ICategorizedEntity, object>> exp = x => x.Category;
var parameter = Expression.Parameter(typeof (T));
var lmd = Expression.Lambda<Func<T, object>>(exp, parameter);
Map(lmd);

这是行不通的,因为在“ map ”函数的深处,它会检查以下内容:

   MemberExpression memberExpression = (MemberExpression) null;
if (expression.NodeType == ExpressionType.Convert)
memberExpression = ((UnaryExpression) expression).Operand as MemberExpression;
else if (expression.NodeType == ExpressionType.MemberAccess)
memberExpression = expression as MemberExpression;
if (enforceCheck && memberExpression == null)
throw new ArgumentException("Not a member access", "expression");

然后我得到“不是成员访问权限\r\n参数名称:表达式”。

我如何创建和转换 MemberExpression 或任何类似的东西?

最佳答案

Func<DerivedFromT,object>表示接受 DerivedFromT 的方法范围。 Func<T,object>表示接受 T 的方法范围。通过delegate variance在 C# 4 中引入,你可以转换 Func<T,object>Func<DerivedFromT,object> ,而不是相反(如您所要求的)。

想想这意味着什么:

public class Person { }

public class Student : Person { }

public static class School
{
public static object Greet(Person person)
{
return null;
}

public static object Promote(Student student)
{
return null;
}
}

在这种情况下,Greet方法匹配委托(delegate) Func<Person,object> , 而 Promote方法匹配委托(delegate) Func<Student,object> .

Func<Person, object> greetPerson = School.Greet;
Func<Student, object> promoteStudent = School.Promote;

我们可以投GreetFunc<Student,object> ;如果我们能迎接Person ,那么我们也可以问候一个Student (谁保证是 Person 的特殊形式)。

Func<Student, object> greetStudent = greetPerson;

但是,我们不能转换 PromoteFunc<Person,object> ;尽管我们可以推广 Student , 我们不能宣传任何 Person一般来说,除非他/她恰好是 Student .

Func<Person, object> promotePerson = promoteStudent;   // Will not compile.

如果我们知道我们的 Person是一个学生,我们可以通过强制转换来表明这一点:

Func<Person, object> promotePerson =
personWhoIsActuallyStudent => promoteStudent((Student)personWhoIsActuallyStudent);

关于c# - 将成员访问函数从 Func<DerivedFromT,object> 转换为 Func<T,object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9236070/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com