是否可以定义匿名变量并在switch
语句中使用它?
这样的事情:
我需要定义一个IEnumerable
类型来实际循环DbContext
中的实体类型。
DAL.DataClasses1DataContext _db = new DAL.DataClasses1DataContext();
var dbItems;
switch (tableName)
{
case "QuarryCats" :
dbItems = _db.QuarryCats.ToList();
break;
}
foreach (var item in dbItems)
{
var orderitem = orderItems.Single(rs => rs.itemId == item.Id);
item.OrderId = orderitem.orderId;
}
_db.SubmitChanges();
目前我收到编译时错误:
Implicity-Type局部变量必须初始化
更新: 来自swich的所有返回类型都有Id和OrderId字段。我需要演员吗?
答案 0 :(得分:0)
如果您不确定变量的类型,则可以将其定义为dynamic
。但你不能使用Intellisense,这是一个缺点。
dynamic myAnonymous;
之后,您可以分配您想要的myAnonymous.It将在运行时初始化的任何内容。
答案 1 :(得分:0)
嗯,“var”要求变量类型应该在编译时定义,例如
var myVar = 1 + 5 / 7.8; // <- Compiler can elaborate that myVar is double
在你的情况下,myAnonymous
的类型取决于 tableName
值 - 这种情况将是
已执行, - 所以myAnonymous
的类型是运行时,这是禁止的。
var myAnonymous; // <- Unknown type, can't be elaborated!
switch (tableName) {
case "QuarryCats" :
myAnonymous = 123; // <- Here it's int
break;
case "SomeOther":
myAnonymous = "ABC"; // <- Here it's String
但是,您可以使用运行时类型定义:
dynamic myAnonymous;
switch (tableName) {
case "QuarryCats" :
myAnonymous = ...
答案 2 :(得分:0)
IEnumerable myAnonymous = new object[]{};
循环:
foreach(var item in myAnonymous) {
var cat = item as QuarryCat;
if(cat != null) {
cat.property = "something new";
}
}
或者,如果您的类型具有公共字段的界面:
IEnumerable<IAnimal> myAnonymous = new IAnimal[]{};
循环:
foreach(var animal in myAnonymous) {
animal.eyeColor = "blue";
}
答案 3 :(得分:0)
试试这个:
IEnumerable<object> myAnonymous = new List<object>();
switch (tableName)
{
case "QuarryCats" : myAnonymous= _db.QuarryCats.ToList();
break;
}
foreach (var item in myAnonymous)
{
}
如果您知道IEnumerable<object>
返回的类型,请使用<{1>}而不是_db.QuarryCats.ToList()
。因此,如果_db.QuarryCats.ToList()
返回QuarryCats
,请使用IEnumerable<QuarryCats>
。
答案 4 :(得分:0)
虽然如其他提到的那样,使用dynamic
可以解决这个问题,但我更愿意考虑更强类型的解决方案。这里重要的是你的交换机分配一个集合,以便稍后枚举。因为这很常见,我会将其用作类型:
IList myAnonymous = null;
switch (tableName)
{
case "QuarryCats" : myAnonymous = _db.QuarryCats.ToList();
break;
}
foreach (var item in myAnonymous )
{
// ..
}
另一件事是,如果集合中的对象实现了一些通用接口会更容易,因此myAnonymous
可以是像IList<ISomeCommonInterface>
这样的通用集合。
换句话说,在我看来,在这里使用var
会带来太多麻烦。