小编kan*_*ans的帖子

表达式中的逆差异

我正在尝试创建一个通用操作代理

  delegate void ActionPredicate<in T1, in T2>(T1 t1, T2 t2);
Run Code Online (Sandbox Code Playgroud)

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();
    }
Run Code Online (Sandbox Code Playgroud)

这是我的来电者

 ActionPredicate<busBase, string> act = DelegateGenerator.GetSetterAction<busPerson>("FirstName");
Run Code Online (Sandbox Code Playgroud)

这是业务对象

 public abstract class busBase 
{

}
public class busPerson : busBase
{
    public …
Run Code Online (Sandbox Code Playgroud)

c# expression covariance contravariance expression-trees

8
推荐指数
1
解决办法
556
查看次数

“System.Int32”类型的 ParameterExpression 不能用于“System.String”类型的委托参数

我正在使用表达式树创建一个通用的 setter,这是我的代码

public Expression<Action<T,string>> GetAction<T>(string fieldName)
{
    ParameterExpression targetExpr = Expression.Parameter(typeof(T), "Target");  
    MemberExpression fieldExpr = Expression.Property(targetExpr, fieldName);    
    ParameterExpression valueExpr = Expression.Parameter(fieldExpr.Type, "value"); 
    UnaryExpression valueCast = (!fieldExpr.Type.IsValueType) 
                              ? Expression.TypeAs(valueExpr, fieldExpr.Type) 
                              : Expression.Convert(valueExpr, fieldExpr.Type);
    BinaryExpression assignExpr = Expression.Assign(fieldExpr, valueCast);    
    return Expression.Lambda<Action<T, string>>(assignExpr, targetExpr, valueExpr);
}
Run Code Online (Sandbox Code Playgroud)

我不调用.Compile()上述方法,因为我想检查它构建的表达式。

我的目标是

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

我这样调用方法

var lastname = GetAction<Person>("FirstName");
var age = …
Run Code Online (Sandbox Code Playgroud)

c# generics delegates dynamic expression-trees

4
推荐指数
1
解决办法
6408
查看次数

Encog One Of - 解码

我在其中一个项目中使用Encog,并且在解雇One-Of Class时遇到困难.字段的Normalization Action之一是NormalizationAction.OneOf,它有三个输出.当我评估时,我想解码预测值.如何解码...?

 var eq = new Encog.MathUtil.Equilateral(classCount, normalizationHigh, normalizationLow);
var predictedClassInt = eq.Decode(output);
Run Code Online (Sandbox Code Playgroud)

以上代码适用于Equilateral.我如何为One-Of做同样的事情.

谢谢,Kans

encog

2
推荐指数
1
解决办法
468
查看次数