优化通用方法逻辑。

3
我有一个通用方法,可以将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,我检查了T的类型。我将T和一个返回T列表的类传递给另一个函数。这个函数位于基类中,我无法更改。


5
这个逻辑完全违背了泛型最初的意图,不是吗? - Jamiec
2个回答

5

我认为你根本不需要使用泛型,可以创建一个通用接口,并由所有类型实现:

public interface IObservableElement
{
    public ObservableCollection<IObservableElement> GetAll();
}

这里调用者传递接口类型,我检查 T 的类型。我将 T 和返回 T 列表的类传递给其他函数。这是基类中的另一个函数,我无法更改它。 - user725388
1
如果您无法根据通用设计进行更改,那么像René Wolferink建议的反射应该是最好的解决方案。 - AlexH

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方法被泛型参数重载,因此可能无法获取正确的方法或因存在两个方法而失败。我会查看是否可以指定正确的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接