Mar*_*tex 2 c# generics reflection types
在我的程序中,我有一个A扩展的类B,C以及更多的类.我有一个方法GetInstance()返回B或C(或其中一个其他孩子)的实例,但我不知道哪一个,所以方法的返回类型是A.
在方法中CreateGenericList(),我有一个v类型的变量,A实际上是一个B,一个C或另一个子类型,我想创建一个正确类型的通用列表,即List<B>如果v是a B或List<C>if v是a C,...
目前我通过使用反射来实现它,但是这非常慢.我想知道是否有另一种方法可以做到这一点,它不使用反射.
以下是我的问题代码示例:
class A { }
class B : A { }
class C : A { }
// More childs of A.
class Program
{
static A GetInstance()
{
// returns an instance of B or C
}
static void CreateGenericList()
{
A v = Program.GetInstance();
IList genericList = // Here I want an instance of List<B> or List<C> or ... depending of the real type of v, not a List<A>.
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了下面的黑客攻击.我调用以下方法,希望类型推断器会猜测类型model,但它不起作用并返回一个List<A>.我相信因为c#是静态类型的,所以它T被解析为一个A而不是model运行时的真实类型.
static List<T> CreateGenericListFromModel<T>(T model) where T : A
{
return new List<T> ();
}
Run Code Online (Sandbox Code Playgroud)
有没有人能够解决那些不使用反射的问题,或者没有反思就无法解决这个问题?
非常感谢你.
如果没有反射,则无法解决此问题,因为必须在编译时知道泛型类型参数.如果你知道你是什么类型的(例如,通过.if(v[0] is B))你可以用v.Cast<B>()它从一个转换List<A>到IEnumerable<B>,您可以通过调用再次变成一个列表ToList().
| 归档时间: |
|
| 查看次数: |
351 次 |
| 最近记录: |