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