我们有一个抽象类BaseClass(注意泛型arg!)和一个叫做me的方法。 我返回这个。抽象类中的返回混凝土类型
如果我们在具体类中使用Me,我们将得到一个返回类型的对象。 然后,我们必须将我的结果转换为我们原来使用的类型。
我们怎样才能实现我返回这个的实际类型?在这个例子中,类型A?
public abstract class BaseClass<TIdentifier>{
public virtual object Me{ get { return this; } }
}
public class A: BaseClass<long>
{
}
public class B: BaseClass<long>
{
}
public class controller{
public void SomeMethod(){
var a = new A();
var b = new B();
var aObject = a.Me; // this will be of type object
var aObjectCasted = (A)aObject; // cast to original
// How I want it
var aConcrete = a.Me; // this returns type a
}
}
更新
由于一些人真的拼命(眨眼:-))希望了解我真正想要做的事。
与NHibernate我们正在做这件事:
var result = Session.Get<A>(idToLookUp);
在某些情况下,它发生的结果不是A型的,但类型AProxy的,由于懒散加载等。现在,如果我们想投结果到别的东西:我们将得到一个invalidcastexception,因为结果的实际类型不是A,而是AProxy。这种类型不能铸造。我们只能将A型转换为另一种类型。
解决此问题的方法在此处描述:http://sessionfactory.blogspot.be/2010/08/hacking-lazy-loaded-inheritance.html。这就是在上面的例子中我财产进来
因此,要获得A类的结果,而不是类型的AProxy我们现在要做到这一点:
var result = (A)Session.Get<A>(idToLookUp).Me;
报告中,我们要投我回如果我们想要读取并了解结果的属性,请键入A.
我的问题:我们可以摆脱铸造和调整我的属性,所以我们立即返回具体类型?
希望现在很清楚。
为什么你需要这样做?你已经可以赋值如下:'object a = new A();'因为所有类的基类都是'System.Object'。 – toadflakz
不要搜索原因。这是一个基于我们公司代码的基础示例。原因更复杂:nhibernate bug:请参阅http://sessionfactory.blogspot.be/2010/08/hacking-lazy-loaded-inheritance.html –
我很难理解你的代码..你正在尝试通过调用方法'A.Me()'来获取属性'Me'?这本身并不起作用,首先你不能称它为一种方法,其次它不是静态的,所以'A.Me'也不行。 – mike