将 typeof(T) 转换为 T。

4

我有这个通用函数:

public List<T> GetList<T>() {
    var businesType = typeof(T);
    var databaseType = AutoMapperConfiguration.TypeMapping[businesType];

    var databaseEntityList = DataModelAccess.GetEntityList(databaseType);

    var businessEntityList = Mapper.Map(databaseEntityList, databaseEntityList.GetType(), typeof(List<T>));
    return (List<T>)businessEntityList;

}

但是我希望的是,不要这样调用DataModelAccess:
DataModelAccess.GetEntityList(databaseType);

将数据库类型作为泛型发送,例如:
DataModelAccess.GetEntityList<DatabaseType>();

为了让这个方法返回像List<T>一样的结果。
谢谢! P.S. DataModelAccess.GetEntityList(databaseType)的定义为:
public static List<object> GetEntityList(Type databaseType)
{
    //get data from database
    //retunt it as List<object> <= and I dont like that
}

4
请给我们展示 DataModelAccess.GetEntityList() 的代码/定义。 - Emond
你为什么需要这个?只是不喜欢将类型作为参数的签名吗?这不是一行代码就能实现的,而且可能根本不值得。 - sll
我希望这个东西可以很容易地被其他程序员使用(这将成为一个库)。谢谢! - Ovidiu Rudi
2个回答

2
一个类似于你的GetList<T>函数应该可以为你解决这个问题。
public List<T> GetEntityList<T>() { }

你可以随后调用它。
typeof(DataModelAccess)
    .GetMethod("GetEntityList")
    .MakeGenericMethod(databaseType)
    .Invoke();

希望这可以帮助到您。

好的,我认为在这种情况下不需要反射,他已经有一个 T 可以使用了。 - frikinside
1
是的,他确实这样做,但他在运行时确定 T(databaseType),因此需要使用反射。 - jvanrhyn
哦!你说得对,我没注意到!我的错!T不是所需的类型。 - frikinside
1
就我个人而言,我认为按照当前函数的方式传递类型是更好的选择。 - jvanrhyn
是的,这似乎是唯一的选择。我希望还有其他方法,但从我的角度来看,这个选项似乎太昂贵了。 - Ovidiu Rudi

2
如果你的GetEntityList方法返回一个通用的List<object>,但是它所有的项都是同一种类型,那么你可以使用IEnumerable.Cast<T>将其转换为List<T>
List<object> result = DataModelAccess.GetEntityList(databaseType);
List<T> databaseEntityList = result.Cast<T>().ToList();

除此之外,如果不改变该方法,您不能以泛型方式调用非泛型方法。

嗯,我会尝试使用这个。谢谢! - Ovidiu Rudi

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