新手C# - 运行时对象转换

时间:2016-07-28 14:07:33

标签: 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>;

然而,到目前为止我所看到的并不是测试变量范围,只是在本地创建新的。

提前致谢。

3 个答案:

答案 0 :(得分:1)

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

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

然而,您可以为test选择一般类型的类型,以便它适合您要放入的所有对象。例如{。{1}}。

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(); 之外的其他类型,这通常足以容纳所有这些类型,但足够精确,以便拥有您需要访问的所有属性。

存在&#34;足够普遍&#34;意味着objectVendorClass<T>都继承自它,但此时我会将您引用到C#手册中继承。 (https://msdn.microsoft.com/en-us/library/ms173149.aspx

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

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

答案 1 :(得分:1)

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

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

ISomeCommonInterface myObject = null;

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

我不是说这是好习惯,但它确实有效。展望未来,您知道myObjectISomeCommonInterface的一个实例。所以你处理那个接口而不再关心实际的实现是什么。

(如果类型继承自声明的类型,或者一个是声明的类型而其他类型继承,那么它也有效。)

否则您只能将变量声明为object类型。现在你可以为它分配任何你想要的类型,但是这又失去了强类型的目的。我们总是希望将对象转换为某种已知的预定类型,以便我们知道如何使用它或与之交互。我们从不想要object然后实现“如果它是这种类型,请调用此方法,但如果它是那种类型,则调用该方法。”

答案 2 :(得分:0)

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

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