1

我有这个:

if (Folder == "Unprocessed")
{
    var FolderEmails = from emails in EmailManagerDAL.Context.Emails
                        join activities in EmailManagerDAL.Context.EmailActivities on emails.ID equals activities.EmailID
                        where activities.EmailID != null
                        select new { emails.ID, emails.MessageFrom,emails.MessageSubject, emails.MessageDeliveryTime };
}
else // Processed
{

}

我需要将 FolderEmails var 移到“if”之上,但遇到了很多困难。

当然,最初将其设置为 null 是非法的。

我试过这样的东西也不起作用:

var FolderEmails = new { ID = new int(), MessageFrom = string.Empty, MessageSubject = string.Empty, MessageDeliverTime = new DateTime() };

真的可以在这方面使用一些帮助。

谢谢!

4

3 回答 3

1

抱歉,这里的正确答案是你不能。C# 3.0 规范将匿名类型描述为从对象初始化程序自动推断和创建的元组类型。对象初始化器指定对象的一个​​或多个字段或属性的值。这意味着您通过一系列分配为对象指定一组属性,并为对象分配这些属性。

在您的情况下,编译器在此处被推断为 FolderEmails 的新对象类型:

var FolderEmails = new { ID = new int(), MessageFrom = string.Empty, MessageSubject = string.Empty, MessageDeliverTime = new DateTime() };

但这种类型的对象可能与此处不同:

select new { emails.ID, emails.MessageFrom,emails.MessageSubject, emails.MessageDeliveryTime };

所以这就是它不允许您执行此操作的原因。在这种情况下,如果你想从 if 块中提取这个 var,你需要创建一个明确的对象来使用它。您只能在初始化后使用 FolderEmails 的 getter 和 setter。

于 2011-06-06T16:09:07.533 回答
1

我知道这有点重新定义问题,你需要匿名类型吗?您能否创建一个类来保存相同的信息,然后创建某种 IEnumerable 容器而不是 var?

List<Foo> FolderEmails;

if (Folder == "Unprocessed")
{
   FolderEmails = from emails in EmailManagerDAL.Context.Emails
                    join activities in EmailManagerDAL.Context.EmailActivities on emails.ID equals activities.EmailID
                    where activities.EmailID != null
                    select new Foo { 
                        ID = emails.ID,
                        MessageFrom = emails.MessageFrom,
                        MessageSubject = emails.MessageSubject, 
                        MessageDeliverTime = emails.MessageDeliveryTime 
                    };
}
else // Processed
{

}

想法是,如果您需要该类型超出该范围,则可能值得创建它。

于 2011-06-06T15:57:27.907 回答
1

我不认为匿名类型打算像您想要的那样使用(编译器根据分配结果创建匿名类型)。为什么不直接声明一个 Tuple 类型并使用它。

编辑:

IEnumerable<Tuple<int, string, string, DateTime>> FolderEmails = 
    default( IEnumerable<Tuple<int,string,string,DateTime>> );

if (folder == "Unprocessed")
{
    FolderEmails = from emails in EmailManagerDAL.Context.Emails
                    join activities in EmailManagerDAL.Context.EmailActivities on emails.ID equals activities.EmailID
                    where activities.EmailID != null
                    select new Tuple<int, string, string, DateTime>
                    (
                        emails.ID,
                        emails.MessageFrom,
                        emails.MessageSubject,
                        emails.MessageDeliveryTime
                    );
}
else // Processed
{

}

您需要更改“select new { field = value }”,因为它不再是正在创建的匿名类型,而是本地声明的显式类型:

Tuple<int,string,string,DateTime>

它们是不可变的值类型,因此您必须调用构造函数来创建它们( select new Tuple( values ) )。

于 2011-06-06T15:59:11.503 回答