2014-04-08 89 views
1

这看起来像一个可能经常出现的模式,所以我想也许有人知道如何做到这一点。假设我有三类:访问动态创建的子类的属性(强类型)

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”)。它最终可能会抛出运行时异常,但这是一种糟糕的用户体验。这是我现在正在编写的解决方案,因为我无法弄清楚如何去做我想做的事情。

无论如何,在这个问题上:任何想法如何做到这一点?

+1

'因为我搞不清楚我想做什么.'你应该先弄清楚你想要什么 – Thewads

+1

你能给一个具体的例子说明你正在试图完成什么吗?您提出问题的方式似乎非常模糊。 “Class2.B =”坏狼“是什么?他们是静态属性?为了使客户端代码以强类型方式访问对象的属性,必须将该对象转换为具有该属性的类型。另一种方法是将对象强制转换为动态,但不会再强制类型化。 – JLRishe

+1

我不认为有什么办法可以让你创建的对象的类型静态地知道你正在做的事情......因此,没有办法静态地知道方法/属性是否存在该对象实例化。你不能使用泛型'实例化()'或什么?即使这似乎相当愚蠢。你为什么需要这样做?除非你有充分的理由,否则你可能会做错* * –

回答

1

如果相关类型在编译类型中未知,则不能强类型化。如果您在编译时知道类型,则可以将其分配或转换为该类型。

您可以使用dynamic关键字来做你想做的事。但是,由于该类型在编译时不为人知,因此如果使用其他类型没有问题的属性,就会冒运行时错误。