繁体   English   中英

在 C# 中传递结构定义

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM