我有一个通用方法,我们可以将T作为接口类型传递。方法返回对应T类型的数据列表。我对此方法有20-25条相同的条件,我该如何优化逻辑。
类实现接口。示例Student类实现IStudent接口。
public ObservableCollection<T> GetAll<T>()
{
try
{
if (typeof(T) == typeof(IStudent))
{
return GetAll<T, Student>();
}
else if (typeof(T) == typeof(IZone))
{
return GetAll<T, Zone>();
}
else if (typeof(T) == typeof(IEmployee))
{
return GetAll<T, Employee>();
}
else if (typeof(T) == typeof(ICourse))
{
return GetAll<T, Course>();
}
}
}
这里调用者传递接口类型T和I检查T的类型。我传递给其他函数T和将返回T的列表的类。我不能改变的基类中的其他函数。 任何人都可以向我提出相同的建议。
答案 0 :(得分:5)
我认为你根本不需要通用,你可以创建一个由你所有类型实现的通用界面:
public interface IObservableElement
{
public ObservableCollection<IObservableElement> GetAll();
}
答案 1 :(得分:2)
你可以尝试通过反思来做到这一点。
public ObservableCollection<T> GetAll<T>()
{
var typeName = typeof(T).FullName;
var indexOfDot = typeName.LastIndexOf('.');
var newTypeName = typeName.SubString(0, indexOfDot) + '.' + typeName.SubString(indexOfDot + 1);
var newType = Type.GetType(newTypeName);
var methodTypes = new [] { typeof(T), newType };
var method = GetType().GetMethod("GetAll");
var typedMethod = method.MakeGenericMethod(methodTypes);
return (ObservableCollection<T>) typedMethod.Invoke(this, new object[0]);
}
不漂亮,但是应该完成这项工作,而且一般都是。
当前方式唯一需要注意的是GetAll
方法被泛型参数重载,因此它可能无法使您获得正确的方法,或者因为有两个方法而失败。如果可以指出正确的那个,我会看看。