在C#中传递结构定义

时间:2019-03-22 12:35:15

标签: c# struct parameters definition

将结构定义传递给函数时遇到问题。不是结构的实例,而是定义。

我们愿意采用其他方法来做自己想做的事情,但是就目前而言,这是我们正在尝试做的事情-

我们正在编写一个用户控件。此控件将以带有标题的列表形式显示数据,但是在设计时可能会要求显示“列表”的内容。现在,我们正在采用一种方法,为了使事情轻巧,我们将传递给构造函数和/或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#中的函数?

3 个答案:

答案 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的运行方式并不熟悉,所以我希望你们都得到了大家的认可。值得!再次感谢!