0

我不确定这是否可以完成,但这是我的问题。

使用 C#,是否可以声明一个泛型或非类型变量,但稍后在我的代码中指定该变量应该是什么?

object genericObject;

if (!testFlag)
{
    genericObject = new SpecificObject1();
}

if (testFlag)
{
    genericObject = new SpecificObject2();
}

genericObject.FirstName = "Samuel";
genericObject.LastName = "Jackson";

我希望在“如果逻辑”之后,我现在可以调用每个“特定”对象共有的类似方法。

那么是否可以在我的代码开头创建某种形式的通用对象并实例化我以后要使用的特定对象?

也许这里还需要考虑设计模式或重构工作。

4

4 回答 4

1

如果两者SpecificObject1共享SpecificObject2相似的属性,您可以为它们添加一个接口。然后,您可以声明genericObject为接口类型并稍后分配具体类型:

public interface SomeInterface
{
    string FirstName { get; set; }
    string LastName { get; set; }
}

public class SpecificObject1 : SomeInterface
{
    // Implementation Details
}

public class SpecificObject2 : SomeInterface
{
    // Other Implementation Details
}

然后,您可以通过以下方式使用它们:

SomeInterface genericObject;

genericObject = testFlag ? new SpecificObject2() : new SpecificObject1();
于 2013-10-22T19:34:03.167 回答
0

您需要将所有公共成员移动到公共基类或接口,然后将变量声明为该类型。

于 2013-10-22T19:33:27.893 回答
0

如果您稍后要分配的类型彼此完全不相关,并且主要具有不同的执行方法集,则在这种情况下,动态可能是您的首选。

在其他情况下,使用标准OOP技术,如继承多态来实现您所说的。

于 2013-10-22T19:34:37.330 回答
0

我建议您定义一个自定义接口来封装您需要使用的所有成员,并在您的两种具体类型上实现它:

interface IMyInteface
{
    string FirstName { get; set; }
    string LastName { get; set; }
}

class SpecificObject1 : IMyInterface { ... }
class SpecificObject2 : IMyInterface { ... }

然后将您的变量声明为该接口的实例:

IMyInterface genericObject;

if (!testFlag)
{
    genericObject = new SpecificObject1();
}

if (testFlag)
{
    genericObject = new SpecificObject2();
}

genericObject.FirstName = "Samuel";
genericObject.LastName = "Jackson";

但如果这不是一个选项,您可以使用dynamic,这将强制在运行时评估任何成员:

dynamic genericObject;

if (!testFlag)
{
    genericObject = new SpecificObject1();
}

if (testFlag)
{
    genericObject = new SpecificObject2();
}

genericObject.FirstName = "Samuel";
genericObject.LastName = "Jackson";
于 2013-10-22T19:35:30.590 回答