C# 新手C——运行时的对象转换

C# 新手C——运行时的对象转换,c#,C#,非常感谢您的帮助 问题: 选择要在运行时应用的三种不同类型,希望根据结果将局部变量转换为类型 例如: Object test; if (something == somethingElse) { test = VendorClass<VendorType> } else { test = OtherVendorClass<OtherVendorType> } 我环顾了StackOverflow,发现了一些很好的例子,比如 var newVar =

非常感谢您的帮助

问题: 选择要在运行时应用的三种不同类型,希望根据结果将局部变量转换为类型

例如:

Object test; 

if (something == somethingElse)
{
   test = VendorClass<VendorType>
}
else
{
   test = OtherVendorClass<OtherVendorType>
}   
我环顾了StackOverflow,发现了一些很好的例子,比如

var newVar = (OtherVendorClass<OtherVendorType>)test;

然而,到目前为止,我所看到的并不是测试变量的作用域,而是在本地创建新的变量


提前感谢。

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


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

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

不过,您可以为测试选择一个非常通用的类型,它适合您想要放入的所有对象。例如,对象

object test;
if (condition)
    test = new VendorClass<VendorType>()
else
    test = new OtherVendorClass<OtherVendorType>()
一个更优雅的解决方案是,找到或定义另一个类型而不是对象,该类型足够通用,可以容纳所有这些类型,但足够精确,可以拥有您需要访问的所有属性

一般来说,这意味着VendorClass和其他VendorClass都继承自它,但在这一点上,我建议您参考C手册了解继承。

编辑:这样的类型也可以是接口,这两种类型都在实现


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

问题是,如果您声明一个变量-test-然后该变量可能包含一种类型、另一种类型或其他类型的对象,那你接下来要怎么处理这个物体?强类型语言的全部要点是,我们知道我们正在处理的每个对象的类型,或者至少知道它的类型

如果这些类型都实现了一些通用接口,那么您可以执行以下操作:

ISomeCommonInterface myObject = null;

if(something == true)
    myObject = new SomethingThatImplementsThatCommonInterface();
else
    myObject = new SomethingElseThatImplementsThatCommonInterface();
我并不是说这是一个好的做法,但它是有效的。接下来,您知道myObject是ISomeCommonInterface的一个实例。因此,您处理该接口,不再关心实际实现是什么

如果类型从声明的类型继承,或者其中一个是声明的类型,而其他类型继承,则这种方法也可以使用


否则,您只能将变量声明为类型对象。现在,您可以将任何类型指定给它,但这同样违背了强类型的目的。我们总是希望将一个对象转换为某种已知的、预先确定的类型,以便我们知道如何使用它或与之交互。我们永远不希望有一个对象,然后实现它,如果它是这种类型,调用这个方法,但是如果它是那种类型,调用那个方法。

这里的问题不是很清楚;你能补充一些细节吗?你在投完票后将如何使用你的测试对象?哇…看起来我做了一些非常错误的事情,看了否定票。有人能告诉我哪里出了问题并让我知道吗?ThanksIt不建议这样做;实际上,您正在两次投射该对象。最好将var foo=myObject尝试为foo;那么test foo就不是空的。无论您是将obj=MyFirstTypemyObject还是myObject作为MyFirstType,这都是您不希望出现的情况。这并不是一条100%都适用的规则,但是应该编写强类型代码,这样我们就可以知道我们要处理的是什么类型,而不必检查对象来找出它的类型。我们不需要知道实际的类型,只需要知道它实现的接口或它继承的基类。这样做的好处是,我们可以在不知道实际类型的情况下使用已知类型。不客气!作为一般的经验法则,如果我们将变量声明为对象,或者如果我们有一个对象,并且我们正在编写任何代码来试图找出它的类型,那么就会出现问题。这两者都不是绝对的,但它们会让你走得更远。
object test;
if (condition)
    test = new VendorClass<VendorType>()
else
    test = new OtherVendorClass<OtherVendorType>()
if(condition)
    ((VendorClass<VendorType>)test).vendorMethod();
else
    ((OtherVendorClass<OtherVendorType>)test).vendorMethod();
ISomeCommonInterface myObject = null;

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