在C#中传递Struct定义

问题描述 投票:-1回答:3

我有一个将结构定义传递给函数的问题。不是结构的实例,而是定义。

我们愿意采取其他方法来做我们想要的事情,但就目前而言,这是我们正在努力做的事情 -

我们正在编写用户控件。此控件用于以列表形式显示带有标题的数据,但在设计时未知可能要求显示的“列表”。现在我们采用的方法是,为了保持轻量级,我们将传递给构造函数和/或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();
        }

- 请注意,我只是想确保我可以解析结构。我们不知道这是否真的有效,因为我们无法通过以下内容进行编译测试。

用户将拥有自己的结构定义,Control无法直接访问该结构定义。

    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函数更改为“Type”,除此之外,但没有任何帮助。

所以,我的问题依次是......

1)这是解决问题的好方法吗?我们完全愿意采取另一种方式,甚至传递整个Class,但我们希望保持轻量级,我们相信这将是。

2)甚至可能吗?

3)这实际上是轻量级的吗?

4)如果是这样,我们如何将结构定义传递给C#中的函数?

c# struct parameters definition
3个回答
0
投票

你所谓的“定义”被称为C#中的Type。如果你知道你想要的信息类型的名称(就像你的情况一样),你可以使用typeof(MineStruct)来获取一个Type对象(你提到你试过作为GetHeaders的参数),你可以从中调用GetFields来获取它领域。如果您有一个想要获取类型信息的对象,则需要调用myObj.GetType()

另外,struct的字段是private(C#中的默认情况),所以你需要在BindingFlags.NonPublic中使用this answer


0
投票

也许使用泛型方法而不是在参数中传递动态,以确保参数是结构:

private void GetHeaders<T>(T str) where T : struct
{
     //Your code...
}    

0
投票

非常感谢你们!综合各种答案,我们得到了它的工作。

1)将GetHeaders中的接收参数更改为“Type”并在调用函数中使用“typeof”将编译器放在我们这边。

2)添加绑定标志“.NonPublic”打开了查看结构。

3)使用Generic为控制建立后填写数据提供了更好的方法。

我想我已经向所有人发送了投票,但我对StackOverflow的操作并不像我想的那样熟悉,所以我希望你们都得到了你应得的荣誉!再次感谢!!

© www.soinside.com 2019 - 2024. All rights reserved.