我有两个接口:无法转换泛型类型的对象,以通用接口C#
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:规则< DmModel,中东,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());
什么错this
为了让这个例子较少混乱我把它简化:
编辑:
我明白的答案后,是什么问题,为了让这个例子不那么容易混淆,我简化了它:
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
@kogoia我做了更多的挖掘,并且注意到你分别声明了你的接口参数为'in'和'out'。这意味着你实际上可以这样做:'var ruleB =(IRule)new RuleB();'DmModel在这种情况下必须是具体的,但是IDbModel可以作为接口保留在cast中。这是否有助于你想要做什么? –
不是,我想得到如上所示的结果'(IRule)new RuleB()' –
kogoia
'public RuleB():base((dm)=> new Middle()){}'我想在这里'(dm)=>新中间(dm.SomeProperty)'中'dm'是'DmModel','SomeProperti'是DmModel类的属性,它不在接口声明中,不能是 – kogoia