Tôi đang cố gắng để tạo ra một Đại biểu Generic ActionContravariance trong Expressions
delegate void ActionPredicate<in T1, in T2>(T1 t1, T2 t2);
và
public static ActionPredicate<T,string> GetSetterAction<T>(string fieldName)
{
ParameterExpression targetExpr = Expression.Parameter(typeof(T), "Target");
MemberExpression fieldExpr = Expression.Property(targetExpr, fieldName);
ParameterExpression valueExpr = Expression.Parameter(typeof(string), "value");
MethodCallExpression convertExpr = Expression.Call(typeof(Convert), "ChangeType", null, valueExpr, Expression.Constant(fieldExpr.Type));
UnaryExpression valueCast = Expression.Convert(convertExpr, fieldExpr.Type);
BinaryExpression assignExpr = Expression.Assign(fieldExpr, valueCast);
var result = Expression.Lambda<ActionPredicate<T, string>>(assignExpr, targetExpr, valueExpr);
return result.Compile();
}
và đây là người gọi tôi
ActionPredicate<busBase, string> act = DelegateGenerator.GetSetterAction<busPerson>("FirstName");
và đây là đối tượng kinh doanh
public abstract class busBase
{
}
public class busPerson : busBase
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public string GetFullName()
{
return string.Format("{0} {1}", FirstName, LastName);
}
}
và đây là lỗi gì tôi nhận được trong quá trình biên soạn
Cannot implicitly convert type 'BusinessObjects.ActionPredicate<BusinessObjects.busPerson,string>' to 'BusinessObjects.ActionPredicate<BusinessObjects.busBase,string>'. An explicit conversion exists (are you missing a cast?)
GetSetterAction tôi là trở lại ActionPerdicate nơi như ở đây T là busPerson và tôi đang cố gắng để lưu trữ nó trong ActionPredicate giữ trong tâm trí về Contravariance. Nhưng nó không thành công. tôi không biết làm thế nào để tiến xa hơn. Hãy giúp tôi..!
Bạn đã thử chuyển đổi rõ ràng chưa? – McGarnagle