我有如下方法:

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/

10-10 18:17