我有以下代码:
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");
}
现在我需要相同的代码但是要调用另一种方法。是否有任何选项可以实现它而无需重复和反射?
答案 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(...)
实现该接口,即UserReview
,ProfessionalReview
等等。
然后你可以这样打电话给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");
}
}