通用变量声明

时间:2013-10-22 19:31:37

标签: c# generics

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

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

object genericObject;

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

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

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

我希望在“if logic”之后我现在可以调用类似的方法,每个“特定”对象都有共同之处。

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

也许有一个设计模式或重构工作也需要在这里考虑。

4 个答案:

答案 0 :(得分:1)

如果SpecificObject1SpecificObject2共享相似的属性,则可以为它们添加接口。然后,您可以将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();

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果你的类型,你将在稍后分配,彼此完全无关,并且主要有不同的方法来执行,dynamic可能是你在这种情况下的偏好选择。

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

答案 3 :(得分: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";