【发布时间】: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