调用复制的通用方法

时间:2011-07-22 08:46:13

标签: c# .net generics

我有以下代码:

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");
            }

现在我需要相同的代码但是要调用另一种方法。是否有任何选项可以实现它而无需重复和反射?

3 个答案:

答案 0 :(得分:3)

听起来像replace conditional with polymorphism的理想机会。你能否将ObjectType.UserReview提升为一个类(此时看起来像enum)并将开关块作为多态方法?

答案 1 :(得分:1)

您可以让MyMethod将接口作为参数,例如IObjectType,就像这样:

MyMethod(IObjectType objectType)

在你的情况下,该接口应包含MyMethod将调用的必要和常用方法:

interface ObjectType
{
    string GetQuery();
}

然后让每个ObjectType使用它自己的特定CreateObjectSet<T>.Where(...)实现该接口,即UserReviewProfessionalReview等等。

然后你可以这样打电话给MyMethod

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

最后,只需让MyMethod致电objectType.DoWork()

答案 2 :(得分:1)

你可以传递代表。

据我所知,你不能将泛型委托部分地解析为提供的方法,并且逐个派生泛型类型,这意味着需要传入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");
        }
    }