ben bir Genel Eylem temsilci oluşturmak çalışıyorumcontravariance Expressions
delegate void ActionPredicate<in T1, in T2>(T1 t1, T2 t2);
ve burada
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();
}
ve
ArayanActionPredicate<busBase, string> act = DelegateGenerator.GetSetterAction<busPerson>("FirstName");
ve burada iş nesnesi
olduğunupublic 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);
}
}
ve burada I My GetSetterAction T busPerson olduğu gibi burada ActionPerdicate dönüyor ve ben ActionPredicate contravariance hakkında akılda tutarak saklayın çalışıyorum
Cannot implicitly convert type 'BusinessObjects.ActionPredicate<BusinessObjects.busPerson,string>' to 'BusinessObjects.ActionPredicate<BusinessObjects.busBase,string>'. An explicit conversion exists (are you missing a cast?)
derleme sırasında ne elde hatadır. Ama başarısız oluyor. Daha fazla nasıl ilerleyeceğimi bilmiyorum. Lütfen yardım et..! Gördüğünüz gibi
Action<string> m1 = MyMethod; //some method to call
Action<object> m2 = m1; //compiler error - but pretend it's not.
object obj = new object();
m2(obj); //runtime error - not type safe
, biz izin verilirse:
Açık dönüşümü denediniz mi? – McGarnagle