【问题标题】:Cast derived class type dynamically to base class type C#将派生类类型动态转换为基类类型 C#
【发布时间】:2016-04-11 07:56:39
【问题描述】:
public DerivedClass : BaseClass
{
   // code
}

DerivedClass B = (DerivedClass)MethodReturnsBaseClassObject();
B.DoWork();  

BaseClass 继承了许多派生类。所以每次我需要编写一个新方法来使用一些属性。

是否有可能使用反射我们使DerivedClass 类型动态并执行类似的操作并使其通用。

System.Type type = GetRequestFromSession().GetType();
type B = (type )MethodReturnsBaseClassObject();
Console.WriteLine( B.Name);  
Console.WriteLine( B.Age);  

感谢任何帮助。

【问题讨论】:

标签: c# asp.net class inheritance reflection


【解决方案1】:

如果您使用具有以下签名的泛型方法,则可以在强制基类约束的同时安全访问派生类型的成员(无需强制转换):

public TDerived MethodReturnsDerivedObject<TDerived>()
    where TDerived : BaseClass

您的调用将如下所示:

DerivedClass b = MethodReturnsDerivedObject<DerviedClass>();

b.ExecuteSomeMethodDefinedInBaseClass();

Console.WriteLine(b.SomePropertyDefinedInDerivedClass);  

【讨论】:

  • 这比使用动态 IMO 要好。
  • 是的,像这样使用泛型将是可行的方法。
  • 这将是许多派生类型的通用实现。我使用动态是因为使用dynamic 我不必改变我的设计。但为此我必须先知道派生类的类型。
【解决方案2】:

对我来说,这感觉像是糟糕的设计:你制作了一些通用的东西,但你却把它当作不是的东西。也许你应该重新考虑你的设计。

对于您所关心的问题,也许您可​​以创建一个代理方法或类来返回您期望的类型。这仅在您调用的方法数量较少时才有用。

另一种选择是使用 dynamic 关键字,但我建议仅在没有其他方法的情况下使用它。

【讨论】:

  • 我知道这是一个非常糟糕的设计。但我需要让它通用。整个应用程序中编写了 34 种相同的方法。我想为将来更好的维护提供一种方法
  • 谢谢帕特里克。在这个设计中使用动态确实可以解决它......但是对于糟糕的设计我很抱歉,我正在新开发这个应用程序。
【解决方案3】:

我现在会接受 Kirill Shlenskiy 的回答。但我也想建议将此方法移到基类本身如果这样做有意义的话。可能存在纠缠不清的依赖关系或其他奇怪的问题阻止了此解决方案,但它也可能允许您在不使用泛型的情况下拥有一个消费者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2016-11-06
    • 2012-12-06
    • 2016-02-26
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多