[英]Passing a Struct definition in C#
我在将结构定义传递给函数时遇到问题。 不是结构的实例,而是定义。
我们对做我们想做的事情的替代方法持开放态度,但就目前而言,这就是我们正在尝试做的事情-
我们正在编写一个用户控件。 该控件以带有标题的列表形式显示数据,但在设计时可能要求它显示什么“列表”是未知的。 现在我们采用的方法是,为了保持轻量级,我们将向构造函数和/或 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();
}
- 请注意,我只是想确保我可以解析结构。 我们不知道这是否真的有效,因为我们无法编译测试,因为下面的内容。
用户将拥有自己的结构定义,控件无法直接访问该定义。
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 函数更改为采用“类型”等,但没有任何帮助。
所以,我的问题是……
1)这是解决问题的好方法吗? 我们完全愿意采取另一种方式,甚至传递整个类,但我们希望保持轻量级,我们相信这会是。
2)这甚至可能吗?
3) 这真的是轻量级的吗?
4) 如果是这样,我们如何将结构定义传递给 C# 中的函数?
也许使用通用方法而不是在参数中传递动态,以确保参数是一个结构体:
private void GetHeaders<T>(T str) where T : struct
{
//Your code...
}
您所说的“定义”在 C# 中称为Type
。 如果您知道您想要了解的类型的名称(就像您的情况一样),您可以使用typeof(MineStruct)
来获取Type
对象(您提到您尝试将其作为GetHeaders
的参数),您可以从中调用GetFields
获取其字段。 如果您有一个想要获取类型信息的对象,则需要调用myObj.GetType()
来代替。
顺便说一句,结构的字段是private
(C# 中的默认情况),因此您需要使用BindingFlags.NonPublic
如本答案所示。
非常感谢大家! 将各种答案放在一起,我们让它起作用了。
1) 将 GetHeaders 中的接收参数更改为“Type”并在调用函数中使用“typeof”使编译器站在我们这边。
2) 添加绑定标志“.NonPublic”打开结构查看。
3) 使用 Generic 为我们提供了一种更好的方法来在建立控件后填写数据。
我想我已经向每个人发送了赞成票,但我并不像我希望的那样熟悉 StackOverflow 的运作方式,所以我希望你们都得到了应有的荣誉! 再次感谢!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.