在 C# 中传递结构定义
Passing a Struct definition in C#
我在将结构定义传递给函数时遇到问题。不是结构的实例,而是定义。
我们愿意接受其他方法来做我们想做的事情,但就目前而言,这就是我们正在努力做的事情 -
我们正在编写用户控件。这个控件是用headers以列表的形式显示数据,但是"list"它可能被要求显示什么在设计时是未知的。现在我们采用的方法是,为了保持轻量级,我们将向 Constructor and/or GetHeaders 函数传递一个 Struct 定义。 headers 将从在传递的结构定义中找到的字段名称中提取,随后数据将进入该结构类型的单个 objects 和 objects 列表。
例子。在控制端:
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...
}
它会在 run-time 上通过,我们曾希望,按照这些思路:
private void button1_Click(object sender, EventArgs e)
{
GetHeaders( MineStruct ); //<-Error messaage here
}
我们收到的错误消息是“'Form1.MineStruct' 是一种类型。它在给定的上下文中无效”
我已经尝试更改 GetHeaders 函数以获取 "Type",但没有任何帮助。
所以,我的问题依次是...
1) 这是处理问题的好方法吗?我们完全愿意采用另一种方式,甚至通过整个 Class,但我们希望保持轻量级,我们相信这会是这样。
2) 有可能吗?
3) 这真的很轻吗?
4) 如果是这样,我们如何将结构定义传递给 C# 中的函数?
也许使用通用方法而不是传递动态参数,以确保参数是一个结构:
private void GetHeaders<T>(T str) where T : struct
{
//Your code...
}
您所谓的 "definition" 在 C# 中称为 Type
。如果你知道你想要了解的类型的名称(就像你的情况一样),你可以使用 typeof(MineStruct)
来获得一个 Type
对象(你提到你尝试作为 [=13= 的参数]),您可以从中调用 GetFields
来获取其字段。如果您有一个想要获取其类型信息的对象,则需要调用 myObj.GetType()
。
顺便说一句,该结构的字段是 private
(C# 中的默认情况),因此您需要使用 BindingFlags.NonPublic
,如 this answer.
非常感谢大家!将各种答案放在一起,我们就开始工作了。
1) 将GetHeaders中的接收参数改为"Type"并在调用函数中使用"typeof"让编译器站在我们这边
2) 添加绑定标志“.NonPublic”打开结构供查看。
3) 使用通用为我们提供了一种更好的方法来在建立控件后填写数据。
我 认为 我已经向所有人发送了赞成票,但我并不像我希望的那样熟悉 Whosebug 的运作方式,所以我希望你已经都得到了你应得的荣誉!再次感谢!!
我在将结构定义传递给函数时遇到问题。不是结构的实例,而是定义。
我们愿意接受其他方法来做我们想做的事情,但就目前而言,这就是我们正在努力做的事情 -
我们正在编写用户控件。这个控件是用headers以列表的形式显示数据,但是"list"它可能被要求显示什么在设计时是未知的。现在我们采用的方法是,为了保持轻量级,我们将向 Constructor and/or GetHeaders 函数传递一个 Struct 定义。 headers 将从在传递的结构定义中找到的字段名称中提取,随后数据将进入该结构类型的单个 objects 和 objects 列表。
例子。在控制端:
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...
}
它会在 run-time 上通过,我们曾希望,按照这些思路:
private void button1_Click(object sender, EventArgs e)
{
GetHeaders( MineStruct ); //<-Error messaage here
}
我们收到的错误消息是“'Form1.MineStruct' 是一种类型。它在给定的上下文中无效” 我已经尝试更改 GetHeaders 函数以获取 "Type",但没有任何帮助。
所以,我的问题依次是...
1) 这是处理问题的好方法吗?我们完全愿意采用另一种方式,甚至通过整个 Class,但我们希望保持轻量级,我们相信这会是这样。
2) 有可能吗?
3) 这真的很轻吗?
4) 如果是这样,我们如何将结构定义传递给 C# 中的函数?
也许使用通用方法而不是传递动态参数,以确保参数是一个结构:
private void GetHeaders<T>(T str) where T : struct
{
//Your code...
}
您所谓的 "definition" 在 C# 中称为 Type
。如果你知道你想要了解的类型的名称(就像你的情况一样),你可以使用 typeof(MineStruct)
来获得一个 Type
对象(你提到你尝试作为 [=13= 的参数]),您可以从中调用 GetFields
来获取其字段。如果您有一个想要获取其类型信息的对象,则需要调用 myObj.GetType()
。
顺便说一句,该结构的字段是 private
(C# 中的默认情况),因此您需要使用 BindingFlags.NonPublic
,如 this answer.
非常感谢大家!将各种答案放在一起,我们就开始工作了。
1) 将GetHeaders中的接收参数改为"Type"并在调用函数中使用"typeof"让编译器站在我们这边
2) 添加绑定标志“.NonPublic”打开结构供查看。
3) 使用通用为我们提供了一种更好的方法来在建立控件后填写数据。
我 认为 我已经向所有人发送了赞成票,但我并不像我希望的那样熟悉 Whosebug 的运作方式,所以我希望你已经都得到了你应得的荣誉!再次感谢!!