繁体   English   中英

如何在C#2.0中支持通用表达式

[英]How do I support generic expression in C# 2.0

我有一些为C#4.0+编写的代码,我确实需要使用C#2.0编译器进行编译。

为了支持相同的功能,以下代码片段我实际上并不是怎么写的:

public sealed class MyClass
{
    private static readonly GenericStaticMethod _deserializeHelper = new GenericStaticMethod(() => DeserializeHelper<object>(null, null, null));
    //...
}

public sealed class GenericStaticMethod
{
    private readonly MethodInfo methodToCall;

    public GenericStaticMethod(Expression<Action> methodCall)
    {
        var callExpression = (MethodCallExpression)methodCall.Body;
        methodToCall = callExpression.Method.GetGenericMethodDefinition();
    }

    public object Invoke(Type[] genericArguments, params object[] arguments)
    {
        try
        {
            return methodToCall
                .MakeGenericMethod(genericArguments)
                .Invoke(null, arguments);
        }
        catch (TargetInvocationException ex)
        {
            throw ex.Unwrap();
        }
    }
}

无法以这种方式编写的表达式是:

() => DeserializeHelper<object>(null, null, null)

如果不修改GenericStaticMethod()则不能直接替换委托:

delegate() { return DeserializeHelper<object>(null, null, null); }

重写GenericStaticMethod可以接受,但我不知道如何。

您只是不能在您的情况下使用表达式树,它们仅在更高版本中得到编译器支持。 但是,如果您使用它的唯一原因是以强类型的方式获取MethodInfo ,则无需这样做。

public sealed class MyClass
{
    private static readonly GenericStaticMethod _deserializeHelper = new GenericStaticMethod(new Action<object, object, object>(DeserializeHelper<object>));
}

public sealed class GenericStaticMethod
{
    private readonly MethodInfo methodToCall;

    public GenericStaticMethod(Delegate methodCall)
    {
        methodToCall = methodCall.Method.GetGenericMethodDefinition();
    }
}

您需要将Action<object, object, object>更改为与DeserializeHelper<object>的签名匹配的委托类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM