2016-07-28 82 views
-5

大部分铸造得到任何帮助....新手C# - 对象在运行时

问题:在运行时被施加三种不同类型的选择 ,希望有本地变量转换取决于结果键入。

例子:

Object test; 

if (something == somethingElse) 
{ 
    test = VendorClass<VendorType> 
} 
else 
{ 
    test = OtherVendorClass<OtherVendorType> 
} 

我看了看周围的StackOverflow,发现了一些很好的例子,如

var newVar = (OtherVendorClass<OtherVendorType>)test; 

var newVar = test as OtherVendorClass<OtherVendorType>; 

然而,所有我见过如此远不是测试变量范围,只是在本地创建新的变量范围。

在此先感谢。

+1

这不是很清楚你在这里问什么;你可以添加更多的细节? –

+0

如何在投射后使用'test'对象? – Fabio

+0

哇....看起来像我做了一些非常错误的看负面投票。有人能告诉我哪里出错了,让我知道吗?谢谢 – ma11achy

回答

0

您可以使用is关键字对您的对象进行类型检查。

if (myObject is MyFirstType) 
{ 
    MyFirstType obj = (MyFirstType)myObject; 
    obj.MyFirstTypeMethod(); 
} 
else if (myObject is MySecondType) 
{ 
    MySecondTypeobj = (MySecondType)myObject; 
    obj.MySecondTypeMethod(); 
} 
+0

不建议这样做;实际上你要投射物体两次。更好地尝试'var foo = myObject作为Foo;'然后测试'foo'不为null。 –

+0

无论你是使用'obj =(MyFirstType)myObject'还是'myObject as MyFirstType',它都是你不想要的情况。它不是100%的所有时间规则,但强类型代码应该是编写的,以便我们已经知道我们正在处理的是什么类型,并且不必检查对象以找出它的类型。我们不必知道* actual *类型 - 只是它实现的接口或它继承的基类。那么好处是我们可以在不知道* actual *类型的情况下使用* known *类型。 –

1

如果你问如何改变变量test的类型,答案是:

你不能。您也无法根据某些条件定义具有不同类型的变量。

但是,您可以选择一种类型为test,它非常通用,适合您要放入的所有对象。例如,object

object test; 
if (condition) 
    test = new VendorClass<VendorType>() 
else 
    test = new OtherVendorClass<OtherVendorType>() 

此代码是有效的,唯一的问题是,你要访问您在test保存对象中的所有时间,你必须将它转换回正确的类型。

if(condition) 
    ((VendorClass<VendorType>)test).vendorMethod(); 
else 
    ((OtherVendorClass<OtherVendorType>)test).vendorMethod(); 

一个更优雅的解决办法是,要找到或定义其他类型比object,这是一般足以容纳所有这些类型的,但不够精确,有你需要访问的所有属性。

“一般”意思是VendorClass<T>OtherVendorClass<T>都从它继承,但在这一点上,我会引用你的C#手册的继承。 (https://msdn.microsoft.com/en-us/library/ms173149.aspx

编辑:这种类型也可以是一个接口,这两种类型都在实现。 (https://msdn.microsoft.com/en-us/library/ms173156.aspx

也可以发布比c#手册更好的资源,毫无疑问在C#中有更好的继承和接口解释。

1

问题是,如果你声明一个变量 - test - 然后该变量可能包含一种类型,另一种类型或其他类型的对象,那么接下来你要做什么?强类型语言的重点在于我们知道每个对象的类型,或者至少知道它的类型。

如果这些不同类型都实现一些常用的接口,那么你可以这样做:

ISomeCommonInterface myObject = null; 

if(something == true) 
    myObject = new SomethingThatImplementsThatCommonInterface(); 
else 
    myObject = new SomethingElseThatImplementsThatCommonInterface(); 

我并不是说这是很好的做法,但它的作品。展望未来,你知道myObjectISomeCommonInterface的一个实例。所以你处理这个接口,不再关心实际的实现是什么。

(这也适用,如果从类型声明的类型继承,或一个是声明的类型和其他人继承。)

否则所有你能做的就是声明你的变量为object型。现在你可以指定任何你想要的类型,但是又一次挫败了强打字的目的。我们总是希望将某个对象转换为某种已知的预定类型,以便我们知道如何使用它或与其进行交互。我们从不想要object然后实现“如果它是这种类型,则调用此方法,但如果它是这种类型,则调用该方法。”

+0

谢谢!我学到了什么不该做:) – ma11achy

+1

不客气!作为一般的经验法则,如果我们将变量声明为'object',或者如果我们有一个对象,并且我们正在编写任何代码来试图找出它的类型,那么就会出现问题。 (这些都不是绝对的,但它们会让你走得更远。) –