Tôi có hai giao diện:Không thể cast đối tượng của loại chung để chung giao diện C#
public interface IDbModel {}
public interface IDmModel {}
Và các lớp học có nguồn gốc từ này:
public class DbModel : IDbModel {}
public class DmModel : IDmModel {}
public class Middle { }
Ngoài ra tôi có hai giao diện với những hạn chế:
public interface IRule { }
public interface IRule<in TInput, out TOutput> : IRule
where TInput : IDmModel
where TOutput : IDbModel
{
TOutput Apply(TInput elem);
}
Và một lớp trừu tượng bắt nguồn từ giao diện này:
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) { ... }
}
Sau này, tôi đã tạo ra hai lớp học có nguồn gốc từ lớp trừu tượng này:
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, Trung, DbModel>: IRule < IDmModel, IDbModel>: IRule
Và khi tôi cố gắng truyền đối tượng của RuleB
đến IRule<IDmModel, IDbModel>
occours unhandled exception
Không thể truyền đối tượng thuộc loại 'ParsreCombinators.RuleB' để nhập 'ParsreCombinators.IRule`2 [ParsreCombinators.IDmModel, ParsreCombinators.IDbModel]'.
var ruleB = (IRule<IDmModel, IDbModel>)new RuleB(); // Exception
IDbModel dbModel = ruleB.Apply(new DmModel());
gì sai với this
Để làm ví dụ ít gây nhầm lẫn tôi đơn giản hóa nó:
EDIT:
Sau câu trả lời tôi đã hiểu, vấn đề là gì và để làm cho ví dụ ít khó hiểu hơn, tôi đơn giản hóa nó:
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 Tôi đã đào sâu hơn một chút và nhận thấy rằng bạn đã khai báo tham số giao diện của mình dưới dạng 'in' và' out' tương ứng. Điều này có nghĩa rằng bạn thực sự có thể làm điều này: 'var ruleB = (IRule) mới RuleB();' DmModel phải được cụ thể trong trường hợp này, nhưng IDbModel có thể được để lại như một giao diện trong diễn viên. Điều đó có giúp ích gì cho những gì bạn đang cố gắng làm không? –
Không hoàn toàn, tôi muốn có được kết quả như trên '(IRule) new RuleB()' –
kogoia
'public RuleB(): base ((dm) => new Middle()) {}' Tôi muốn rằng 'dm' là' DmModel' ở đây '(dm) => new Middle (dm.SomeProperty)', 'SomeProperti' là thuộc tính của lớp DmModel không có trong khai báo giao diện và không thể là – kogoia