我有兩個接口:無法轉換泛型類型的對象,以通用接口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