Бросок к анонимному типу

Это позволяет Вашему редактору/IDE, действительно автоматически заполняют умное предложение.

49
задан mkj 17 October 2016 в 22:21
поделиться

4 ответа

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


Вы можете сделать это с помощью уловки, обманом заставив компилятор вывести правильный тип для вас:

using System;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            var a = new { Id = 1, Name = "Bob" };
            TestMethod(a);

            Console.Out.WriteLine("Press enter to exit...");
            Console.In.ReadLine();
        }

        private static void TestMethod(Object x)
        {
            // This is a dummy value, just to get 'a' to be of the right type
            var a = new { Id = 0, Name = "" };
            a = Cast(a, x);
            Console.Out.WriteLine(a.Id + ": " + a.Name);
        }

        private static T Cast<T>(T typeHolder, Object x)
        {
            // typeHolder above is just for compiler magic
            // to infer the type to cast x to
            return (T)x;
        }
    }
}

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

private static T CastTo<T>(this Object value, T targetType)
{
    // targetType above is just for compiler magic
    // to infer the type to cast value to
    return (T)value;
}

Использование:

var value = x.CastTo(a);

Но мы ' мы действительно раздвигаем границы здесь. Используйте настоящий шрифт, он также будет выглядеть чище.

85
ответ дан 7 November 2019 в 11:29
поделиться

Цитата MSDN :

Анонимный тип не может быть приведен к любому интерфейсу или типу, кроме объекта.

8
ответ дан 7 November 2019 в 11:29
поделиться

В C # 3.0 это невозможно. Вам придется дождаться C # 4.0, который позволяет получать доступ к свойствам во время выполнения с помощью «динамических» переменных.

6
ответ дан 7 November 2019 в 11:29
поделиться

вы можете попробовать следующее:

private void cmdOK_Click(object sender, EventArgs e)
{
    var option = Cast(bsOptions.Current, new { Id = 0, Option = "", Description = "" });
}

см .: Не удается вернуть анонимный тип из метода? В самом деле?

1
ответ дан 7 November 2019 в 11:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: