Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用复制的通用方法_C#_.net_Generics - Fatal编程技术网

C# 调用复制的通用方法

C# 调用复制的通用方法,c#,.net,generics,C#,.net,Generics,我有以下代码: switch (objectType) { case ObjectType.UserReview: return MyMethod<UserReview>(); case ObjectType.ProfessionalReview: return MyMethod<ProfessionalRevi

我有以下代码:

switch (objectType)
            {
                case ObjectType.UserReview:
                    return MyMethod<UserReview>();
                case ObjectType.ProfessionalReview:
                    return MyMethod<ProfessionalReview>();
                case ObjectType.Question:
                    return MyMethod<Question>();
                case ObjectType.News:
                    return MyMethod<News>();
                default:
                    throw new ArgumentOutOfRangeException("objectType");
            }

现在我需要相同的代码,但用于调用另一个方法。有没有不需要重复和反思就能实现它的选项?

听起来是一个理想的机会。您能否将ObjectType.UserReview升级为一个类?目前它看起来像一个枚举,并将开关块作为多态方法放置?

您可以让MyMethod将接口作为参数,例如IOObjectType,如下所示:

MyMethod(IObjectType objectType)
MyMethod(new UserReview()) // Ok because UserReview implements IObjectType
该接口应包含MyMethod将在您的情况下调用的必要和常用方法:

interface ObjectType
{
    string GetQuery();
}
然后让每个ObjectType使用自己特定的CreateObjectSet.Where…(即UserReview、ProfessionalReview等)实现该接口

然后按如下方式调用MyMethod:

MyMethod(IObjectType objectType)
MyMethod(new UserReview()) // Ok because UserReview implements IObjectType

最后,只需让MyMethod调用objectType.DoWork即可。

您可以传递委托

据我所知,您不能将泛型委托部分解析为提供的方法,而泛型类型是逐案派生的,因此这意味着需要传入4个函数引用

    public static string DoStuff<T,U,V,W>(Type objectType,
        Action<T> f, Action<U> g, Action<V> h, Action<W> i)
    {
        switch (objectType)
        {
            case ObjectType.UserReview:
                return f();
            case ObjectType.ProfessionalReview:
                return g();
            case ObjectType.Question:
                return h();
            case ObjectType.News:
                return i();
            default:
                throw new ArgumentOutOfRangeException("objectType");
        }
    }

因为这是meReflection的最后一个度量,所以在这里无论如何都不起作用,因为ObjectType!=类型您能在这里添加更多的上下文吗?您能根据MyMethod接收的类型揭示MyMethod的功能吗?@Andreas,它调用ctx.CreateObjectSet.Where…,从而生成实体框架查询