在 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 的运作方式,所以我希望你已经都得到了你应得的荣誉!再次感谢!!