我有一个将结构定义传递给函数的问题。不是结构的实例,而是定义。
我们愿意采取其他方法来做我们想要的事情,但就目前而言,这是我们正在努力做的事情 -
我们正在编写用户控件。此控件用于以列表形式显示带有标题的数据,但在设计时未知可能要求显示的“列表”。现在我们采用的方法是,为了保持轻量级,我们将传递给构造函数和/或GetHeaders函数一个Struct定义。标题将从传递的结构定义中找到的字段名称中提取,数据稍后将进入单个对象和该结构类型的对象列表中。
例。在控制方面:
private void GetHeaders( dynamic _strc )
{
//Type _str_type = ((ObjectHandle) _str).Unwrap().GetType();
FieldInfo[] fi = _strc.GetFields( BindingFlags.Public | BindingFlags.Instance );
int _i = 0;
foreach (FieldInfo _f in fi)
{
textBox1.Lines[_i] = _f.Name;
}
textBox1.Refresh();
}
- 请注意,我只是想确保我可以解析结构。我们不知道这是否真的有效,因为我们无法通过以下内容进行编译测试。
用户将拥有自己的结构定义,Control无法直接访问该结构定义。
public struct MineStruct
{
String ID; // So we know who they are
String Name; // What we call them to their face
String Nickname;// What we call them behind their back
String Address; // We know where they live
int Mileage; // How far they've gone
int Millage; // How much they'll pay. Oh, they'll pay...
}
它将在运行时通过,我们希望,在这些方面:
private void button1_Click(object sender, EventArgs e)
{
GetHeaders( MineStruct ); //<-Error messaage here
}
我们得到的错误信息是“'Form1.MineStruct'是一种类型。它在给定的上下文中无效”我尝试将GetHeaders函数更改为“Type”,除此之外,但没有任何帮助。
所以,我的问题依次是......
1)这是解决问题的好方法吗?我们完全愿意采取另一种方式,甚至传递整个Class,但我们希望保持轻量级,我们相信这将是。
2)甚至可能吗?
3)这实际上是轻量级的吗?
4)如果是这样,我们如何将结构定义传递给C#中的函数?
你所谓的“定义”被称为C#中的Type
。如果你知道你想要的信息类型的名称(就像你的情况一样),你可以使用typeof(MineStruct)
来获取一个Type
对象(你提到你试过作为GetHeaders
的参数),你可以从中调用GetFields
来获取它领域。如果您有一个想要获取类型信息的对象,则需要调用myObj.GetType()
。
另外,struct的字段是private
(C#中的默认情况),所以你需要在BindingFlags.NonPublic
中使用this answer。
也许使用泛型方法而不是在参数中传递动态,以确保参数是结构:
private void GetHeaders<T>(T str) where T : struct
{
//Your code...
}
非常感谢你们!综合各种答案,我们得到了它的工作。
1)将GetHeaders中的接收参数更改为“Type”并在调用函数中使用“typeof”将编译器放在我们这边。
2)添加绑定标志“.NonPublic”打开了查看结构。
3)使用Generic为控制建立后填写数据提供了更好的方法。
我想我已经向所有人发送了投票,但我对StackOverflow的操作并不像我想的那样熟悉,所以我希望你们都得到了你应得的荣誉!再次感谢!!