Объявление анонимного типа в C # - PullRequest
2 голосов
/ 10 марта 2011

У меня есть статический класс с методом, который использует linq и возвращает объект. Мой компилятор не хочет его компилировать, потому что ему нужно определение объекта. Можете ли вы сказать мне, какие мнения я должен определить объект?

Я ищу крошечное решение, я не хочу создавать для него дополнительный класс (если в этом нет необходимости?)

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

Ответы [ 3 ]

1 голос
/ 24 марта 2011

другое решение: Скрытые возможности 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;
}
1 голос
/ 10 марта 2011

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

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

0 голосов
/ 18 марта 2011

Для .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; }
}

ИЛИ у вас есть опция Tuple

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