小编典典

转换为匿名类型

c#

我今天遇到以下问题,我想知道我的问题是否有解决方案。

我的想法是建立匿名类,并将其用作WinForm BindingSource的数据源:

public void Init()
{
    var option1 = new
                  {
                      Id = TemplateAction.Update,
                      Option = "Update the Templates",
                      Description = "Bla bla 1."
                  };

    var option2 = new
                  {
                      Id = TemplateAction.Download,
                      Option = "Download the Templates",
                      Description = "Bla bla 2."
                  };

    var list = new[] {option1, option2}.ToList();

    bsOptions.DataSource = list; // my BindingSource

    // cboTemplates is a ComboBox
    cboTemplates.DataSource = bsOptions; 
    cboTemplates.ValueMember = "Id";
    cboTemplates.DisplayMember = "Option";

    lblInfoTemplates.DataBindings.Add("Text", bsOptions, "Description");
}

到目前为止,一切正常。

我遇到的问题是要从BindingSource的“当前”属性中获取ID,因为我无法将其强制转换回匿名类型:

private void cmdOK_Click(object sender, EventArgs e)
{
    var option = (???)bsOptions.Current;
}

我想没有办法找出“当前”类型并访问“ Id”属性?也许有人有一个好的解决方案…

我知道还有其他(也是更好的)获取ID的方法(反射,从ComboBox读取值,不使用匿名tpyes,…)我只是好奇是否有可能从bsOptions中获取Type。电流优雅。


阅读 343

收藏
2020-05-19

共1个答案

小编典典

注意
,根据注释,我只想指出,当您需要像这样在程序中传递实类型时,我也建议使用实类型。匿名类型实际上应该一次只在一种方法中本地使用(我认为),但是无论如何,这就是我剩下的答案。


您可以使用技巧,通过诱使编译器为您推断正确的类型:

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

但是,我们实际上是在推动极限。使用实型字体,外观和感觉也会更干净。

2020-05-19