将结构定义传递给函数时遇到问题。不是结构的实例,而是定义。
我们愿意采用其他方法来做自己想做的事情,但是就目前而言,这是我们正在尝试做的事情-
我们正在编写一个用户控件。此控件将以带有标题的列表形式显示数据,但是在设计时可能会要求显示“列表”的内容。现在,我们正在采用一种方法,为了使事情轻巧,我们将传递给构造函数和/或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)这是解决此问题的好方法吗?我们完全愿意采取其他方法,甚至可以通过整个Class,但我们希望保持它的轻量级,我们相信这是应该的。
2)可能吗?
3)这实际上是轻量级的吗?
4)如果是,我们如何将Struct定义传递给C#中的函数?
答案 0 :(得分:0)
也许可以使用通用方法来代替动态传递参数,以确保参数是struct:
private void GetHeaders<T>(T str) where T : struct
{
//Your code...
}
答案 1 :(得分:0)
您所说的“定义”在C#中称为Type
。如果您知道要查询的类型的名称(视情况而定),则可以使用typeof(MineStruct)
获取一个Type
对象(您曾提到过您尝试将其作为{{1}的参数) }),您可以从中调用GetHeaders
来获取其字段。如果您有想要获取类型信息的对象,则需要调用GetFields
。
顺便说一句,该结构的字段是myObj.GetType()
(C#中的默认情况),因此您需要像this answer中那样使用private
。
答案 2 :(得分:0)
非常感谢大家!汇总各种答案,我们就可以使用它。
1)将GetHeaders中的接收参数更改为“ Type”,并在调用函数中使用“ typeof”使编译器站在我们这边。
2)添加绑定标志“ .NonPublic”打开了该结构以供查看。
3)使用泛型为我们提供了一种更好的方法,可以在建立控件后填写数据。
我认为我已经向所有人发送了赞誉,但是我对StackOverflow的运行方式并不熟悉,所以我希望你们都得到了大家的认可。值得!再次感谢!