gpt4 book ai didi

c# - 在抽象类中返回具体类型

转载 作者:太空狗 更新时间:2023-10-29 21:08:15 24 4
gpt4 key购买 nike

我们有一个抽象类 BaseClass(注意泛型 arg!),它有一个名为 me 的方法。我退回这个。

如果我们在具体类中使用 Me,我们将得到一个返回类型对象。然后我们必须将 Me 的结果转换为我们最初使用的类型。

我们如何实现 Me 返回 this 的实际类型?在这个例子中输入 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 类型。现在如果我们想将结果转换为其他内容:我们将得到一个无效的转换异常,因为结果的实际类型不是 A 而是 AProxy。那个类型不能被类型转换。我们只能将类型 A 转换为其他类型。

此处描述了解决此问题的方法:http://sessionfactory.blogspot.be/2010/08/hacking-lazy-loaded-inheritance.html .这就是上面示例中的 Me 属性的用武之地。

因此,为了获得 A 类型的结果而不是 AProxy 类型的结果,我们现在必须这样做:

var result = (A)Session.Get<A>(idToLookUp).Me;

请注意,如果我们想要读取并了解结果的属性,我们必须将我转换回类型 A。

我的问题:我们能否摆脱强制转换并调整 Me 属性以便立即返回具体类型?

希望现在一切都清楚了。

最佳答案

您可以在派生类上使用接口(interface):

public interface IStrongTypedMe<T>
{
T Me();
}

您的派生类将变为:

public class A: BaseClass<long>, IStrongTypedMe<A>
{
public new A Me()
{
return base.Me() as A;
}
}

当然,这是假设您可以更改 A

更新:

我现在明白了这个问题(现在只有时间阅读链接的文章)。

尝试使用扩展方法为您进行转换,如下所示:

    public static TReturnType As<TReturnType,TIdentifier>(this BaseClass<TIdentifier> proxyObject)
where TReturnType : class
{
return proxyObject.Me as TReturnType;
}

你会像这样使用它:

var result = Session.Get<A>(idToLookUp).As<A,long>();

无需更改 AB

关于c# - 在抽象类中返回具体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35060408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com