首页 / C# / c# – 在重载方法中使用泛型类型
c# – 在重载方法中使用泛型类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 在重载方法中使用泛型类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1945字,纯文字阅读大概需要3分钟。
内容图文
![c# – 在重载方法中使用泛型类型](/upload/InfoBanner/zyjiaocheng/802/5859106741ca4e06914e2c11f2c031af.jpg)
我有一个通用的方法:
public bool DoSomething<T>(T item) where T: IBase
{
return DoSomethingSpecific(item);
}
public bool DoSomethingSpecific(IBase item)
{
return true;
}
public bool DoSomethingSpecific(IAdvanced item)
{
return false;
}
请注意,IAdvanced接口从IBase接口派生/继承.
我发现如果我调用DoSomething,其中项目的类型为IAdvanced,它仍然总是返回false.我不明白这一点.我知道,因为IAdvanced是一个类型IBase(因为它是这个接口的子代),它可能会导致DoSomethingSpecific方法的2个重载类型之间的混淆.但是,正如我对有限的C#知识所理解的那样,应该在这里选择IAdvanced方法.这是我如何得出这个结论的一个例子:
public class Advanced: IAdvanced
{
public void CallMethod()
{
DoSomething(this);
}
}
这导致了真正的价值.
但是,如果我这样做:
public class Advanced: IAdvanced
{
public void CallMethod()
{
DoSomethingSpecific(this);
}
}
它返回false,这是我所期望的.
我不得不说我之前从未使用过仿制药.我曾试过,但总是陷入这样的情况,然后完全没有看到使用泛型的意义(除了树和链表之类的数据结构).
这次我决定来这里寻求一些建议.我试图做的是否有明显的问题?尝试做我在这里忙的事情可能没有意义吗?
解决方法:
据他所知,这是一个IBase.编译器需要确定你调用哪种方法,这就是它总是选择那个方法的原因.
一个肮脏的技巧将是这样做:
public static bool DoSomething<T>(T item) where T: IBase
{
var isAdvanced = typeof(IAdvanced).IsAssignableFrom(typeof(T));
return isAdvanced ? DoSomethingSpecific((IAdvanced)item) : DoSomethingSpecific(item);
}
另一种方法是使用Double-Dispatch / Visitor模式:
public interface IDoSomethingVisitor?{
bool DoSomethingSpecific(IBase base);
bool DoSomethingSpecific(IAdvanced adv);
}
DoSomething方法将在您的IBase界面中:
public interface IBase{
void DoSomething(IDoSomethingVisitor visitor);
}
在您的实施中:
public class Base : IBase
{
public bool DoSomething(IDoSomethingVisitor visitor)
{
visitor.DoSomething(this);
}
}
public class Advanced : IAdvanced
{
public bool DoSomething(IDoSomethingVisitor visitor)
{
visitor.DoSomething(this);
}
}
在这种情况下,使用纯继承解决问题.实际的实例是解析调用哪个方法的实例.不,如果.
内容总结
以上是互联网集市为您收集整理的c# – 在重载方法中使用泛型类型全部内容,希望文章能够帮你解决c# – 在重载方法中使用泛型类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。