我正在努力在一个树层次结构中进行投射,下面是一个类层次结构的例子,如果有人能指出我正确的方向,我真的很感激。
我无法施放
var myobj2 = (IR<JB>)JR;
类:
public class BASEA{ }
public class B: BASEA{ }
public class C: B{ }
public interface IR<T> { }
public abstract class JR<T> : IR<T> where T : B
{ public abstract void SetRule(); }
public class Action: JB<C>
{
public override void SetRule()
{
//Logic
}
}
public static class RuleLib
{
public static void ApplyTest<T>(T obj, IR<T> JB) where T:B
{
var myobj2 = (IR<JB>)JR; //=> does not cast!
}
}
public class Test
{
[Test]
public void demo()
{
var obj = new B();
var action = new Action();
RuleLib.ApplyRule(obj,action);
}
}
答案 0 :(得分:4)
为此,您的IRule
界面需要协变。给出here的示例显示了以下协方差:
IEnumerable<Derived> d = new List<Derived>();
IEnumerable<Base> b = d;
这基本上就是你正在做的事情。因此,在您的代码中,您需要做的就是编写
public interface IRule<out T> { ... }
而不是
public interface IRule<T> { ... }
这使得您可以从IRule<U>
转换为IRule<V>
,其中U
是V
的子类(例如从IRule<ShiftAction>
转换为{ {1}})。