2011-08-16 38 views
0

我有以下代码初始化和范围的一个通用的抽象类

  var dataCollection; 
      if (ViewBag.WageType.ToLower() == "perm") 
      { 
       dataCollection = ViewBag.PermWageIndex; 
      } 
      else if(ViewBag.WageType.ToLower() == "trial") 
      { 
       dataCollection = ViewBag.TrialWageIndex; 
      } 

返回类型可以是AbstractClass<Concrete1>AbstractClass<Concrete2>。我必须在声明中初始化var。但是,这意味着我失去了我想要的范围。如何修改此代码以允许动态dataCollections而不依赖于ViewBag?

+0

你不能让方法(或包含的类)通用?在很少的背景下很难提供建议。什么是'AbstractClass'? 'Concrete1'和'Concrete2'之间有一些关系吗?结果如何被使用? – svick

+0

@svick - 我不得不解释一些设计来回答这些问题。我希望这是解决问题的足够信息。它可能不是...... –

回答

2

您可能可以使AbstractClass<>实现接口IAbstractClass,然后使该通用类型。

这是否有效取决于返回类型需要访问哪些成员。很明显,它不能提及任何一般类型的成员,但是这无意义,因为我假设消费者不应该知道通用参数是什么。

+0

+1啊,当然你是对的。消费者(观点)不应该处理问题,而是控制者。这使得它很容易解决。 –

2

解决这个唯一的办法是通过提供其继承了基类或接口/通过Concrete1Concrete2实现,从而可以声明dataCollection作为AbstractClass<ISomething>

Var不是动态类型,它在编译时解析。因此,不能在没有赋值的情况下声明变量(var x;),因为编译器无法推断出类型。

您可以回退到objectdynamic但是如果您这样做,则会丢失任何类型的安全。