首页 / C# / C#:将子类实例分配给抽象类实现的接口
C#:将子类实例分配给抽象类实现的接口
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#:将子类实例分配给抽象类实现的接口,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2585字,纯文字阅读大概需要4分钟。
内容图文
![C#:将子类实例分配给抽象类实现的接口](/upload/InfoBanner/zyjiaocheng/805/f9b686e7b7244620ad9f023be86d5280.jpg)
public interface IParser<T> where T: new()
{
IList<T> Parse();
}
上面的接口是通过以下抽象类实现的
public abstract class BaseParser<T>: IParser<T> where T : new()
{
protected abstract string Sql { get;}
public List<T> Parse()
{
// do parsing
Console.WriteLine(Sql);
}
}
以下是上面抽象类的两个具体实现
public class EMailParser: BaseParser<Email>
{
protected override string Sql
{
get
{
return @"SELECT * FROM emails";
}
}
}
public class UrlParser : BaseParser<Url>
{
protected override string Sql
{
get
{
return @"SELECT * From Url";
}
}
}
用法:
class Program
{
static void Main(string[] args)
{
if(args[1] == "url")
Parser<Url>();
else
Parser<Email>();
}
static void Parse<T>()
{
// Create instance based on typof T and then assign to implementaion
IParser<T> parser = typeof(T) == typeof(Url) ? new UrlParser(): new EmailParser();
parser.Parse();
}
}
我想基于Program.Main方法中提供的泛型类型创建EmailParser或UrlParser的实例,并将其分配给BaseParser实现的接口(抽象类).我怎样才能做到这一点?我知道我可以通过修改Program.Parse< T>来解决这个问题了.如下
static void Parse<T>() where T: new()
{
IParser<T> parser = typeof(T) == typeof(Url) ? new UrlParser() as BaseParser<T> : new EmailParser() as BaseParser<T>;
parser.Parse();
}
但是我想知道为什么我不能将子类实例分配给抽象类实现的接口?
我无法理解为什么以下行不起作用
IParser<T> parser = typeof(T) == typeof(Url) ? new UrlParser(): new EmailParser();
为什么这条线工作
IParser<T> parser = typeof(T) == typeof(Url) ? new UrlParser() as BaseParser<T> : new EmailParser() as BaseParser<T>;
根据@nawfal的回答,这一行也不应该起作用,因为BaseParser和BaseParser是不同的类型. BaseParser中是否存在IParser的隐含案例?
解决方法:
因为UrlParser和EmailParser之间没有隐式转换.他们都回到BaseParser< Url>和BaseParser<电子邮件> (或IParser< Url>和IParser< Email>),就编译器而言,两者都是不同的类型.
我会保留一本字典来保存类型信息的地图,然后使用反射.像(未经测试)的东西:
static Dictionary<string, Type> typeInfos = new Dictionary<string, Type>
{
{ "url", typeof(Url) },
{ "email", typeof(Email) },
// and so on
};
你也是,
class Program
{
static void Main(string[] args)
{
Parse(args[1]);
}
static void Parse(string type)
{
var parserType = typeof(BaseParser<>)
.Assembly // or whatever the assembly is
.GetTypes()
.First(t => t.BaseType?.GetGenericArguments().FirstOrDefault() == typeInfos[type]);
dynamic parser = Activator.CreateInstance(parserType);
parser.Parse();
}
}
使用表达式树和/或缓存事物来加快速度.
更新:否,BaseParser< T>和BaseParser< T>是完全一样的.在泛型方法中,T一次只能有一个值.真正的问题是如何将新的UrlParser()转换为BaseParser< T>.在一般的上下文中,有可能使用C#规则将任何内容转换为任何东西(我不知道哪个部分完全符合规范).
内容总结
以上是互联网集市为您收集整理的C#:将子类实例分配给抽象类实现的接口全部内容,希望文章能够帮你解决C#:将子类实例分配给抽象类实现的接口所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。