我有以下代码
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 :(得分:2)
解决此问题的唯一方法是提供由Concrete1
和Concrete2
继承/实现的基类或接口,以便将dataCollection
声明为AbstractClass<ISomething>
。
Var不是动态类型,它在编译时解析。因此,如果没有赋值(var x;
),则无法声明变量,因为编译器无法推断出类型。
您可以回退到object
或dynamic
,但如果您这样做,则会失去任何类型的安全。
答案 1 :(得分:2)
您可以让AbstractClass<>
实现接口IAbstractClass
,然后将其设为常用类型。
这是否有效取决于返回类型需要访问的成员。显然,它无法引用任何一般类型的成员,但这无论如何都没有多大意义,因为我假设消费者不应该知道通用参数是什么。