我目前正在尝试使用ZXing库在Windows Phone 7.5中开发移动条形码阅读器。 看到我在这里发帖,你可能已经猜到我遇到了一些我不知道任何解决方案的问题。
问题如下: ZXing库允许多种条形码格式 - 但是,我想为用户提供一个设置菜单,专门针对一个条形码。
BarcodeFormat-object是静态的,包含我想要分配的只读成员(类型为BarcodeFormat)。
看到并听到反射是这种动态行为的有力武器,我想我会尝试一下。
到目前为止,我的代码使用
从ZXing获取所有可能的格式MemberInfo[] plist = typeof(BarcodeFormat).GetMembers();
这适用于获取格式的名称,这意味着我可以在列表中成功显示名称。 但是在尝试将这些格式分配给实际的阅读器时遇到了问题,因为我只有MemberInfo而不再是BarcodeFormat。
到目前为止,我只找到了用户想要动态访问(设置/获取)变量的示例。 然而,提议的解决方案似乎不适合我的问题 - 至少我没有找到任何方式以这些方式分配格式。
任何帮助都会很棒:) 非常感谢你。
编辑: BarcodeFormat的使用方式如下:
WP7BarcodeManager.ScanMode = BarcodeFormat.ITF;
在此示例中,只接受ITF中的条形码(交错的2/5)格式。
到目前为止,我尝试了以下方法。
只需指定MemberInfo对象而不是原始的BarcodeFormat对象。
将MemberInfo对象转换为BarcodeFormat。
我尝试使用FieldInfo和getValue,但似乎我必须创建一个示例对象并为所需的字段赋值以获取值。这不能在这里完成,因为对象是静态的,而字段是只读的。
整个ZXing库被编译为我将项目链接到的DLL。 (它似乎正确连接,因为其他一切都有效)。 BarcodeFormat的示例声明如下所示
public static readonly BarcodeFormat ITF
答案 0 :(得分:2)
例如:
PropertyInfo CurCultProp = (typeof(CultureInfo)).GetProperty("CurrentCulture");
Console.WriteLine("CurrCult: " + CurCultProp.GetValue(null,null));
所以您需要做的就是致电GetProperties()
而不是GetMembers()
并致电GetValue(null, null)
来获取价值。
答案 1 :(得分: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;
答案 2 :(得分:1)
我不完全理解你为什么要经历反思的麻烦。
您可以枚举这样的条形码类型(确定虚拟代码,您应该绑定到列表框/选择器但是......):
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;