我有如下方法:
public IEnumerable<T> GetControls<T>()
: where T : ControlBase
{
// removed.
}
然后,我创建了一个类:
public class HandleBase<TOwner> : ControlBase
: TOwner
{
// Removed
}
我想可以打电话
GetControls<HandleBase<this.GetType()>>;
它将使用THIS类的类型传递给HandleBase的地方。本质上,这将获取所有拥有此类型所有者的HandleBase。
我怎样才能做到这一点?
编辑:
我使用的是.NET 2.0,因此大于2.0的解决方案将不起作用。
这个想法是让ControlBase为“ child ”拥有其他ControlBase的集合。然后可以使用
GetControls<T>()
根据类型查询它们。例如,这将允许我获取Shape的所有HandleBase。然后,我可以将所有这些都设置为Visible = false或对它们进行其他处理。因此,我可以为集合操作特定类型的子级。HandleBase<TOwner>
需要TOwner,因为它具有对“拥有类型”的引用。因此,您只能添加将HandleBase扩展到Shape的所有内容。有道理?感谢您提供的所有帮助!
最佳答案
您可以通过在编译时指定类型或使用反射来执行此操作。
您可以这样进行反射:
typeof(SomeClass).GetMethod("GetControls")
.MakeGenericMethod(typeof(HandleBase<>).MakeGenericType(GetType()))
.Invoke(someObject, null);
注意,它将返回一个
object
;您将无法将其转换为IEnumerable<T>
(除非您知道编译时的T
是什么,在这种情况下没有意义)。您可以将其转换为IEnumerable
。但是,这是一个坏主意。
您可能有更好的解决方案;请提供更多细节。
关于C#在运行时传递泛型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2608254/