में मैं एक सामान्य कार्रवाई प्रतिनिधि बनाने के लिए कोशिश कर रहा हूँcontravariance भाव
delegate void ActionPredicate<in T1, in T2>(T1 t1, T2 t2);
और
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();
}
और यहां मेरे फोन करने वाले
ActionPredicate<busBase, string> act = DelegateGenerator.GetSetterAction<busPerson>("FirstName");
है और यहाँ व्यापार वस्तु
है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);
}
}
और यहाँ त्रुटि मैं क्या
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 ActionPerdicate जहां यहाँ के रूप में टी busPerson है लौटा रहा है और मैं में ActionPredicate contravariance के बारे में ध्यान में रखते हुए यह स्टोर करने के लिए कोशिश कर रहा हूँ संकलन के दौरान प्राप्त है। लेकिन यह विफल रहता है। मुझे नहीं पता कि आगे कैसे आगे बढ़ना है। कृपया सहायता कीजिए..!
क्या आपने स्पष्ट रूपांतरण की कोशिश की? – McGarnagle