簡體   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