2011-03-10 4 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' должен компилироваться. –

+5

Noooooo ...... удалите этот блок catch. Почему, по-вашему, вам это нужно? –

+0

О, вы правы, в начале у меня нет «FirstOrDefault()», и я не уверен, что функция генерирует исключение, если он не может найти XElement – jwillmer

ответ

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; } 
} 

ИЛИ у вас есть кортеж Вариант

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

Если вы хотите статический типизированное (и названное) решения, вы должны создать отдельный класс. Есть некоторые хакерские способы избежать этого, но это не очень хорошая идея в целом.

Другой вариант - вернуть IEnumerable<Tuple<string, string>>, если вы используете .NET 4. Таким образом, вы теряете имена «время» и «включено», но держите идею, что это пара строк.

+1

. В случае OP «IEnumerable», вероятно, не необходимо. Простой «Tuple». –

+0

Я использую .NET 3.5 IENumerable был одной из моих первых идей, но я не могу получить его прямо. Могу ли вы отправить мне пример с IEnumerable, пожалуйста? – jwillmer

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; 
} 
Смежные вопросы