2012-05-30 40 views
0

我目前正在嘗試使用ZXing庫在Windows Phone 7.5中開發移動條形碼閱讀器。 看到我在這裏發帖,您可能已經猜到我正面臨某種我不知道解決方案的問題。在C#中,如何動態獲取靜態類的成員?

問題是: ZXing庫允許多個條形碼格式 - 但是,我想包括一個設置菜單,讓用戶專注於一個條形碼。

BarcodeFormat-object是靜態的,它包含我想分配的只讀成員(類型爲BarcodeFormat)。

視覺聽覺的反射是這樣的動態行爲的有力武器,我想我會試試看。

到目前爲止,我有一些代碼使用

MemberInfo[] plist = typeof(BarcodeFormat).GetMembers(); 

,用來獲取的格式的名稱,這意味着我可以成功地顯示在列表中的名稱的工作會從斑馬線所有可能的格式。 但是我試圖將這些格式分配給實際的閱讀器時遇到了問題,因爲我只有MemberInfo並且不再有BarcodeFormat。

到目前爲止,我只找到了用戶想要動態訪問(set/get)變量的例子。 然而,提出的解決方案似乎並不適合我的問題 - 至少我沒有找到任何方式來以這些方式分配格式。

任何幫助將是偉大的:) 非常感謝。

編輯: 的BarcodeFormat使用這樣的:

WP7BarcodeManager.ScanMode = BarcodeFormat.ITF; 

在這個例子中,只有在ITF條碼(交錯2選自5)格式將被接受。

到目前爲止我嘗試以下方法。

只需指定MemberInfo對象,而不是原始的BarcodeFormat對象。

角色的的MemberInfo對象BarcodeFormat。

我試圖使用FieldInfo和getValue,但似乎我必須創建一個示例對象並將值分配給所需的字段以獲取值。這不能在這裏完成,因爲對象是靜態的並且該字段是隻讀的。

整個斑馬線庫被編譯爲我聯繫我的項目一個DLL。 (它似乎是正確鏈接的,因爲其他的工作)。BarcodeFormat的例子聲明如下所示

public static readonly BarcodeFormat ITF 
+0

什麼是你的問題,從的MemberInfo所獲得的價值在這種情況下,它會很高興知道他們是領域還是屬性,還是將問題分配給別的東西?你嘗試過什麼,失敗了? –

+0

如果我說你在另一個對象的構造函數中需要這個BarcodeFormat,我是錯的嗎?如果是,您可以顯示您使用的「沒有反思的代碼」嗎? –

+0

@RuneFS:我不知道如何從MemberInfo獲取值。 – Betaminos

回答

2

獲得ITF動態:

var formatName = "ITF"; 
var format = typeof(BarcodeFormat) 
    .GetProperty(formatName, BindingFlags.Static | BindingFlags.Public) 
    .GetValue(null, null); 

集WP7BarcodeManager.ScanMode:

WP7BarcodeManager.ScanMode = (BarcodeFormat)format; 

PS

成員BarcodeFormat:

var _format = member is PropertyInfo 
    ? ((PropertyInfo)member).GetValue(null, null) 
    : ((FieldInfo)member).GetValue(null); 
var format = (BarcodeFormat)_format; 
+0

由於某些我未知的原因,GetProperty返回null。我嘗試了多個名稱,但每次都返回null。使用GetProperty時,是否需要額外使用wirewire? – Betaminos

+0

解決方案是使用您發佈的FieldInfo。非常感謝:) – Betaminos

2

"Because static properties belong to the type, not individual objects, get static properties by passing null as the object argument"

例如:

PropertyInfo CurCultProp = (typeof(CultureInfo)).GetProperty("CurrentCulture"); 
Console.WriteLine("CurrCult: " + CurCultProp.GetValue(null,null)); 

因此,所有你需要做的是電話GetProperties(),而不是GetMembers(),並呼籲GetValue(null, null)得到值。

+0

感謝您的解決方案。不幸的是,它遭遇了與DarkGray的第一種方法相同的問題 - 即FieldInfo而不是PropertyInfo。 – Betaminos

1

我不完全理解爲什麼你去通過gh與反射的麻煩。

您可以枚舉條碼類型,像這樣(OK啞代碼,你應該綁定到一個列表框/選擇器,但..):

var mgr = new BarcodeTypeManager(); 
foreach (var barCode in mgr.BarcodeTypes) 
{ 
    WP7BarcodeManager.ScanMode = barCode.BarcodeType; 
} 

(事實上,還有一個BarcodePhotoChooser選擇器,你可以使用)

而且,如果用戶可以保存一個優選的類型,你可以輕鬆地再次查找:

var typeToUse = mgr.BarcodeTypes.Where(b => b.Name == "what user selected").FirstOrDefault(); 
WP7BarcodeManager.ScanMode = typeToUse.BarcodeType; 
+0

在我的情況下,該庫不提供任何BarCodeTypeManager。我正在使用[這個ZXing的端口到WP7](http://silverlightzxing.codeplex.com)。此外,它是關於如何通過反射來訪問那些靜態的,只讀的成員,我很好奇。只是發生了這樣的情況,我通過在條形碼閱讀器上工作,發現了我缺乏這方面的知識:) – Betaminos

+0

好吧,對你的遊行隊伍下雨感到抱歉,但這與我指的是完全相同的圖書館。它的確提供了我建議的課程。但是,正如在許多情況下,每個人都是。 –