C#在运行时传递泛型

The*_*Sky 10 c# generics .net-2.0

我有一个像下面这样的方法:

public IEnumerable<T> GetControls<T>()
 : where T : ControlBase
{
 // removed.
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个类:

public class HandleBase<TOwner> : ControlBase
 : TOwner
{
 // Removed
}
Run Code Online (Sandbox Code Playgroud)

我想能打电话

GetControls<HandleBase<this.GetType()>>; 
Run Code Online (Sandbox Code Playgroud)

它将使用THIS类的类型传递给HandleBase.这基本上会使所有拥有此类型所有者的HandleBase.

我怎样才能做到这一点?

编辑:

我正在使用.NET 2.0,因此大于2.0的解决方案将无效.

这个想法是让ControlBase拥有一个其他ControlBase的集合,用于"孩子们".然后可以根据它们的类型查询它们GetControls<T>().例如,这将允许我为Shape获取所有HandleBase.然后我可以采取所有这些并设置Visible = false或用它们做其他事情.因此,我可以为一个集合操纵特定类型的孩子.

HandleBase<TOwner>需要TOwner,因为它引用了"拥有类型".因此,您只能添加任何将HandleBase扩展到Shape的内容.合理?

感谢您的帮助!

SLa*_*aks 14

您可以通过在编译时指定类型或使用反射来执行此操作.

你可以用这样的反射做到这一点:

typeof(SomeClass).GetMethod("GetControls")
    .MakeGenericMethod(typeof(HandleBase<>).MakeGenericType(GetType()))
    .Invoke(someObject, null);
Run Code Online (Sandbox Code Playgroud)

注意它会返回一个object; 你不能把它投射到IEnumerable<T>(除非你知道什么T是编译时,在这种情况下没有意义).你可以把它投射到IEnumerable.

但是,这是个坏主意.
可能有更好的解决方案; 请提供更多细节.

  • 这可以使用反射,通过调用`typeof(SomeClass).GetMethod("GetControls").MakeGenericMethod(typeof(HandleBase <>).MakeGenericType(GetType())).Invoke(someObject,null)` (3认同)

The*_*Sky 0

这是特定于我的实现的,但我能够通过HandleBase先创建一个非泛型然后创建一个泛型来解决这个问题HandleBase<TOwner>,因为使用 TOwner 的唯一地方是财产所有者。

然后,当我可以调用GetControls<HandleBase>并获取所有 HandleBase 时,无论所有者是谁。

谢谢大家的解答!