6

创建一个变量的正确方法是什么,该变量将容纳通过 a 生成的匿名对象列表,LINQ query同时将变量声明保持在 a 之外try/catch并且在 a 内部处理分配try/catch

目前我将变量声明为IEnumberable<object>,但是当我稍后尝试使用它时,这会导致一些问题......

IE

var variableDeclaration;
try{
    ...
    assignment
    ...
}catch...

编辑:

如果它是相关的(不认为它是相关的),则作为JsonMVC3 操作的结果返回对象列表。我正在尝试减少一些using语句在数据库中打开的时间,因为我遇到了一些我正在尝试解决的性能问题。在进行一些测试时,我遇到了这个问题,似乎找不到关于它的信息。

编辑2:

如果我可以要求避免专注于LINQ. 虽然使用了 LINQ,但问题更具体到与Anonymous对象相关的范围问题。不是使用 LINQ(在这种情况下)来生成它们的事实。

此外,一些答案提到了使用dynamicwhile 这将编译它不允许我稍后在该方法中需要的用法。如果我想要做的事情是不可能的,那么目前的答案似乎是class用我需要的定义创建一个新的并使用它。

4

6 回答 6

4

好吧,如果您使用的是 LINQ,除非具体化,否则不会评估查询...

因此,您可能能够:

var myQuery = //blah
try
{
    myQuery = myQuery.ToList();  //or other materializing call
}
catch
{
}
于 2013-01-28T01:59:23.180 回答
4

可以通过创建Jon Skeet在此处Cast概述的通用方法来解决此问题。它会起作用并为您提供所需的智能感知。但是,在这一点上,为您的 linq 方法创建自定义类型有什么问题?

public class MyClass
{
    public int MyInt { get; set; }
}

IEnumerable<MyClass> myClass = 
    //Some Linq query that returns a collection of MyClass
于 2013-01-28T02:02:58.450 回答
1

你能不能使用dynamic??

     dynamic variableDeclaration;
     try
     {
         variableDeclaration = SomeList.Where(This => This == That);
     }
     catch { }

不确定这会在您的代码块中进一步影响什么,但只是一个想法:)

于 2013-01-28T02:08:11.543 回答
1

如果您在像 try/catch 一样使用它之前声明变量,则不能使用 [var],因为它是预期的。相反,您必须键入变量。

var x = 0;
try{
   x = SomethingReturningAnInt();
}

或者

int x;
try{
   x = SomethingReturningAnInt();
}

但是,在您的情况下,您并不真正“知道”该方法返回什么

var x = ...;
try{
   x = Something();
}
catch{}

行不通

当您事先不知道类型时,您可以选择使用动态:

dynamic x;
try{
   x = Something();
}
catch{}

(但这感觉就像回到 VB4)

于 2013-01-28T02:13:43.233 回答
1

另一个作弊:您可以在本地定义变量(类似于 Jon 在 Dave Zych 答案中的破解),然后在 try/catch 中使用它。只要您可以在 try-catch 之前创建相同的匿名项目类型就可以了(因为具有相同字段名称和类型的匿名类型被认为是相同的):

var myAnonymouslyType = Enumerable.Repeat(
    new {Field1 = (int)1, Field2 = (string)"fake"}, 0);

try 
{ 
   myAnonymouslyType = ...(item => 
     new {Field1 = item.Id, Field2=item.Text})...
}
...

这比Jon 在函数之间的匿名类型转换中涵盖的选项更安全,因为如果类型不匹配,编译器会立即发现错误。

注意:如果你必须这样做,我会投票给非匿名类型......

注 2:根据您的实际需要,考虑简单地从 try/catch 内部返回数据,并在外部进行第二次默认信息返回。

于 2013-01-28T02:51:38.280 回答
1

这让我烦恼了一段时间。最后,我构建了一些通用辅助方法,我可以在其中传入生成匿名对象的代码,并将 catch 代码作为 lamdas 如下

public static class TryCatch
{
    public static T Expression<T>(Func<T> lamda, Action<Exception> onException)
    {
        try
        {
            return lamda();
        }
        catch(Exception e)
        {
            onException(e);
            return default(T);
        }            
    }

}

//and example

Exception throwexception = null;
        var results = TryCatch.Expression(
            //TRY
            () => 
                {
                    //simulate exception happening sometimes.
                    if (new Random().Next(3) == 2)
                    {
                        throw new Exception("test this");
                    }
                    //return an anonymous object
                    return new { a = 1, b = 2 };
                } ,
            //CATCH
            (e) => { throwexception = e;                         
                     //retrow if you wish
                     //throw e;
                   }
            );

https://gist.github.com/klumsy/6287279

于 2013-08-20T21:45:43.930 回答