gpt4 book ai didi

c# - 转换为匿名类型

转载 作者:IT王子 更新时间:2023-10-29 03:50:19 28 4
gpt4 key购买 nike

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

我的想法是构建匿名类并将其用作 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;
}

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

我知道还有其他(而且更好)的方法来获取 Id(反射,从 ComboBox 中读取值,而不是使用匿名类型,...)我只是好奇是否可以获取 Type bsOptions.Current 以一种优雅的方式。

最佳答案

注意,根据评论,我只想指出,当您需要在程序中传递它时,我也建议使用真实类型,例如这个。匿名类型实际上一次只能在一个方法中在本地使用(在我看来),但无论如何,这是我的其余答案。


你可以用一个技巧来做到这一点,通过欺骗编译器为你推断正确的类型:

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

但我们确实在挑战极限。使用真实类型,它看起来和感觉起来也会更干净。

关于c# - 转换为匿名类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1409734/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com