C# 优化泛型方法逻辑

C# 优化泛型方法逻辑,c#,class,c#-4.0,logic,generic-method,C#,Class,C# 4.0,Logic,Generic Method,我有一个通用方法,我们可以将T作为接口类型传递。方法返回与T类型对应的数据列表。对于这种方法,我有20-25个相同的条件,如何优化逻辑 类实现接口。示例学生类实现IStudent接口 public ObservableCollection<T> GetAll<T>() { try { if (typeof(T) == typeof(IStudent)) {

我有一个通用方法,我们可以将T作为接口类型传递。方法返回与T类型对应的数据列表。对于这种方法,我有20-25个相同的条件,如何优化逻辑

类实现接口。示例学生类实现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>();
            }
         }
    }
publicobservableCollection GetAll()
{
尝试
{
if(typeof(T)=typeof(IStudent))
{                 
返回GetAll();
}
else if(typeof(T)=typeof(IZone))
{
返回GetAll();
}
否则如果(类型(T)=类型(I员工))
{
返回GetAll();
}
否则如果(typeof(T)=typeof(ICourse))
{
返回GetAll();
}
}
}

在这里,调用者传递接口类型T,我检查T的类型。我传递给其他函数T和类,它将返回基类中我不能更改的其他函数的列表。 有人能给我一些相同的建议吗。

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

public interface IObservableElement
{
    public ObservableCollection<IObservableElement> GetAll();
}
公共接口IObservableElement
{
公共可观测集合GetAll();
}

您可以尝试通过反射来实现这一点

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]);
}
publicobservableCollection GetAll()
{
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(observeCollection)typedMethod.Invoke(这个,新对象[0]);
}
不漂亮,但应该做的工作和做的是一般


当前方法唯一需要注意的是,
GetAll
方法被泛型参数重载,因此它可能无法为您找到正确的方法,或者因为有两个方法而失败。我将看看是否可以指出正确的方法。

这个逻辑不是完全违背了泛型的观点吗?这里是调用方传递接口类型和检查T的类型。我将传递给其他函数T和类,它将返回基类中我不能更改的T的列表。如果您不能更改基于泛型的设计,Rene Wolferink建议的反射应该是最好的问题