我目前正在尝试实现一个抽象算法
后者通过开发人员提供的解析器将Data转换为Xml 进入预期的指定类型
这种转换器的接口:
public interface IParser<TExcpected, TSource> where TExcpected : class where TSource : class
{
TExcpected Parse(TSource source);
}
这一切都适用于许多不同类型,直到需要专门化它 并通过指定的算法将键值对转换为元数据 原型:
public abstract class KeyValuePairParserBase<TKey, TValue, TMetadata>
: IParser<TMetadata, IEnumerable<KeyValuePair<TKey, TValue>>> where TMetadata : class
{
public abstract TMetadata Parse(IEnumerable<KeyValuePair<TKey, TValue>> source);
}
然后我实现了一个默认类,作为开发人员类的代表
class KeyValuePairParser<TKey,TValue>
: KeyValuePairParserBase<TKey, TValue,KeyValuePairList<TKey,TValue>>
{
public override KeyValuePairList<TKey,TValue> Parse(IEnumerable<KeyValuePair<TKey, TValue>> source)
{.....}
}
其中KeyValuePairList是一个通用的Xml Serializable类,包含一些默认格式的元数据列表。
在算法类中,它也有这三个通用类型参数, 我有一个基本类型的属性
public KeyValuePairParserBase<TKey,TValue,TSerialized> Parser {get;set;}
并且在尝试这样做时
Parser = new KeyValuePairParser<TKey,TValue>();
编译器声称类型不匹配
我错过了什么?
帮助将不胜感激!
环境:Windows 8.1 .NET 4.5.1,C#,VS 2013
答案 0 :(得分:1)
如果你看一下实例类的定义:
class KeyValuePairParser<TKey,TValue>
: KeyValuePairParserBase<TKey, TValue,KeyValuePairList<TKey,TValue>>
您将看到只有2个类型参数:TKey和TValue
但是字段
private KeyValuePairParserBase<TKey,TValue,TSerialized> Parser {get;set;}
定义了三个类型参数:TKey,TValue和TSerialized。
您必须将此字段定义为:
private KeyValuePairParserBase<TKey,TValue, KeyValuePairList<TKey,TValue>> Parser {get;set;}
一切都会正确。
答案 1 :(得分:0)
我最终将KeyValuPairList和KeyValuePairParser的使用推迟到继承类,这解决了这个问题。