【问题标题】:Accessing properties of dynamically created subclass (strongly typed)访问动态创建的子类的属性(强类型)
【发布时间】:2014-04-09 01:14:46
【问题描述】:

这似乎是一种可能经常出现的模式,所以我想也许 SO 上的某个人知道这是如何完成的。假设我有三个类:

class Class1 {
    string A { get; set; }
}
class Class2 : Class1 {
    string B { get; set; }
}
class Class3 : Class1 {
    string C { get; set; }
}

还有一个字符串:x = "Namespace.Class2";

目标是库代码实例化x 给定类型的实例,该实例提供给客户端。然后客户端访问 Class2 的强类型属性,如下所示:

Class2 test = CreateTheObject();
test.B = "bad wolf";
test.A = "super";

你说得对,我们可以反映属性,但它不再是强类型的。用户可以执行 GetProperty(Class2, "SomePropertyThatDoesntExist")。它最终可能会引发运行时异常,但这是一种糟糕的用户体验。这是我现在正在编写的解决方案,因为我不知道如何做我想做的事情。

无论如何,关于这个问题:知道这是如何完成的吗?

【问题讨论】:

  • since I couldn't figure out what I wanted to do. 你应该先弄清楚你想要什么
  • 你能举一个具体的例子来说明你想用这个来完成什么吗?您提出问题的方式似乎非常模糊。 Class2.B = "bad wolf" 是怎么回事?它们是静态属性吗?为了让客户端代码以强类型方式访问对象的属性,必须将对象强制转换为具有该属性的类型。另一种方法是将对象强制转换为动态对象,但这将不再是强类型的。
  • 我不认为有任何方法可以静态地知道您正在创建的对象的类型...因此,没有办法静态地知道实例化的对象上是否存在方法/属性。你不能使用泛型Instantiate<X>() 什么的吗?即使这样看起来也很愚蠢。为什么需要这样做?除非你有充分的理由,否则你可能做错了...
  • 感谢大家的回复! @Thewads:错字。已编辑。 to: JLRishe: 抱歉,这只是一个懒惰的启发式方法。我明确地创建了对象。 to: JeffBridgman:也很抱歉,我很懒。希望这更清楚。
  • 如果所讨论的类型在编译类型时未知,则不能进行强类型化。如果您在编译时知道类型,您可以分配或强制转换为该类型。

标签: c# inheritance reflection


【解决方案1】:

如果所讨论的类型在编译类型时未知,则不能进行强类型化。如果您在编译时知道类型,您可以分配或强制转换为该类型。

您可以使用dynamic 关键字来做您想做的事。但是,由于该类型在编译时是未知的,因此如果使用不具有相关属性的其他类型,则可能会出现运行时错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-07
    • 2013-07-12
    • 2017-07-14
    • 2019-05-02
    • 2020-12-01
    • 2020-01-08
    • 1970-01-01
    相关资源
    最近更新 更多