Это позволяет Вашему редактору/IDE, действительно автоматически заполняют умное предложение.
Примечание , в соответствии с комментарием, я просто хотел бы указать, что я тоже рекомендую использовать реальный тип, когда вам нужно передать его по программе, как это. Анонимные типы действительно должны использоваться только локально в одном методе за раз (на мой взгляд), но в любом случае, вот остальная часть моего ответа.
Вы можете сделать это с помощью уловки, обманом заставив компилятор вывести правильный тип для вас:
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);
Но мы ' мы действительно раздвигаем границы здесь. Используйте настоящий шрифт, он также будет выглядеть чище.
Цитата MSDN :
Анонимный тип не может быть приведен к любому интерфейсу или типу, кроме объекта.
В C # 3.0 это невозможно. Вам придется дождаться C # 4.0, который позволяет получать доступ к свойствам во время выполнения с помощью «динамических» переменных.
вы можете попробовать следующее:
private void cmdOK_Click(object sender, EventArgs e)
{
var option = Cast(bsOptions.Current, new { Id = 0, Option = "", Description = "" });
}
см .: Не удается вернуть анонимный тип из метода? В самом деле?