我有两个接口:
public interface IDbModel {}
public interface IDmModel {}
以及继承自此类的类:
public class DbModel : IDbModel {}
public class DmModel : IDmModel {}
public class Middle { }
此外,我有两个带限制的接口:
public interface IRule { }
public interface IRule<in TInput, out TOutput> : IRule
where TInput : IDmModel
where TOutput : IDbModel
{
TOutput Apply(TInput elem);
}
有一个抽象类是从这个接口继承而来的:
public abstract class Rule<TDmModel, TMiddle, TDb> : IRule<TDmModel, TDb>
where TDmModel : IDmModel
where TDb : IDbModel
{
private readonly Func<TDmModel, TMiddle> _rule;
protected Rule(Func<TDmModel, TMiddle> rule) { _rule = rule; }
protected abstract TDb Apply(TMiddle transformedMessage);
public TDb Apply(TDmModel elem) { ... }
}
接着我创建了两个继承自这个抽象类的类:
public class RuleA : Rule<DmModel, Middle, DbModel>
{
public RuleA(Func<DmModel, Middle> rule) : base(rule) {}
protected override DbMode Apply(Middle transformedMessage) { ... }
}
public class RuleB : RuleA
{
public RuleB() : base((dm) => new Middle()) {}
}
RuleB : RuleA : Rule< DmModel,Middle,DbModel > : IRule< IDmModel,IDbModel > : IRule
当我试图将对象RuleB
强制转换为类型 IRule<IDmModel, IDbModel>
时,会发生未处理的异常。
无法将类型为“ParsreCombinators.RuleB”的对象强制转换为类型“ParsreCombinators.IRule`2[ParsreCombinators.IDmModel,ParsreCombinators.IDbModel]”。
var ruleB = (IRule<IDmModel, IDbModel>)new RuleB(); // Exception
IDbModel dbModel = ruleB.Apply(new DmModel());
这个链接有什么问题?
为了让示例更加清晰,我对其进行了简化:
编辑:
在得到答案后,我理解了问题,并对示例进行了简化:
public interface IDbModel {}
public interface IDmModel {}
public class DbModel : IDbModel {}
public class DmModel : IDmModel {}
public interface IRule<in TInput, out TOutput>
where TInput : IDmModel
where TOutput : IDbModel
{
TOutput Apply(TInput elem);
}
public class RuleA : IRule<DmModel, DbModel>
{
public DbModel Apply(DmModel elem) { ... }
}
var ruleA = (IRule<IDmModel, IDbModel>)new RuleA(); // Exception
in
和out
。这意味着您实际上可以这样做:var ruleB = (IRule<DmModel, IDbModel>)new RuleB();
在这种情况下,DmModel 必须是具体的,但是在转换中 IDbModel 可以保留为接口。这对您正在尝试做的事情有所帮助吗? - Chris Berger(IRule<IDmModel, IDbModel>)new RuleB()
。 - giokoguashvilipublic RuleB() : base((dm) => new Middle(dm.SomeProperty)) {}
我希望这里的dm
是DmModel
,其中SomeProperty
是DmModel
类中的属性,该属性未在接口声明中,并且不能被访问。 - giokoguashviliout
。我不太了解你正在做什么,无法确定它是否有效。 - Chris Berger