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.
但是,这是个坏主意.
可能有更好的解决方案; 请提供更多细节.
这是特定于我的实现的,但我能够通过HandleBase先创建一个非泛型然后创建一个泛型来解决这个问题HandleBase<TOwner>,因为使用 TOwner 的唯一地方是财产所有者。
然后,当我可以调用GetControls<HandleBase>并获取所有 HandleBase 时,无论所有者是谁。
谢谢大家的解答!
| 归档时间: |
|
| 查看次数: |
810 次 |
| 最近记录: |