2011-03-10 194 views
2

我有一个使用linq并返回对象的方法的静态类。我的编译器不想编译它,因为他需要一个对象的定义。你能告诉我哪些意见我必须定义对象吗?C#匿名类型声明

我搜索了微小的解决方案,我不希望为它创建一个额外的类(如果没有必要?)

public static object GetWaveAnimation() 
{ 
    return (from element in configurations.Elements("Animation") 
      where element.Attribute("NAME").Value == "Wave" 
      select new 
       { 
        time = element.Attribute("TIMING").Value, 
        enable = element.Attribute("ENABLED").Value 
       }).FirstOrDefault(); 
} 
+0

什么是错误信息?你知道你不能使用'var'让编译器为你推断返回类型,但是返回'object'应该编译。 – 2011-03-10 10:19:59

+5

Noooooo ......删除那个catch块。你为什么认为你需要它? – 2011-03-10 10:20:16

+0

哦,你是对的,一开始我还没有“FirstOrDefault()”,我不确定如果函数抛出一个异常,如果它找不到XElement – jwillmer 2011-03-10 10:35:09

回答

0

对于.net 3.5只是咬紧牙关它是最干净的外观解决方案。

public struct Wave{ 
    public X time; 
    public Y enable; 
} 

public static Wave GetWaveAnimation() 
    { 
     try 
     { 
      return (from element in configurations.Elements("Animation") 
        where element.Attribute("NAME").Value == "Wave" 
        select new Wave 
         { 
          time = element.Attribute("TIMING").Value, 
          enable = element.Attribute("ENABLED").Value 
         }).FirstOrDefault(); 
     } 
     catch { return null; } 
    } 

对于.NET 4.0您可以使用动态关键字(但因为匿名类型是内部的,你不能从你的程序集或朋友组件的外部调用此方法。)

public static dynamic GetWaveAnimation() 
{ 
    try 
    { 
     return (from element in configurations.Elements("Animation") 
       where element.Attribute("NAME").Value == "Wave" 
       select new 
        { 
         time = element.Attribute("TIMING").Value, 
         enable = element.Attribute("ENABLED").Value 
        }).FirstOrDefault(); 
    } 
    catch { return null; } 
} 

OR你的元组选

public static Tuple<X,Y> GetWaveAnimation() 
     { 
      try 
      { 
       return (from element in configurations.Elements("Animation") 
         where element.Attribute("NAME").Value == "Wave" 
         select Tuple.Create(
            element.Attribute("TIMING").Value, 
            element.Attribute("ENABLED").Value 
           ) 
          }).FirstOrDefault(); 
      } 
      catch { return null; } 
     } 
1

如果你想有一个静态类型(和命名)的解决方案,你应该创建一个单独的类。 有一些避免它的黑客方法,但它通常不是一个好主意。

如果您使用的是.NET 4,另一种选择是返回IEnumerable<Tuple<string, string>>。这样您就失去了“时间”和“启用”的名称,但保留它是一对字符串的想法。

+1

在OP的情况下,IEnumerable可能不是需要。一个简单的'Tuple'就可以做到。 – 2011-03-10 10:21:30

+0

我正在使用.NET 3.5 IENumerable是我的第一个想法之一,但我无法弄清楚。你可以用IEnumerable给我发个例子吗? – jwillmer 2011-03-10 10:31:23

1

另一种解决方案:Hidden Features of C#?

// Useful? probably not. 
private void foo() 
{ 
    var user = AnonCast(GetUserTuple(), new { Name = default(string), Badges = default(int) }); 
    Console.WriteLine("Name: {0} Badges: {1}", user.Name, user.Badges); 
} 

object GetUserTuple() 
{ 
    return new { Name = "dp", Badges = 5 }; 
}  

// Using the magic of Type Inference... 
static T AnonCast<T>(object obj, T type) 
{ 
    return (T) obj; 
}