0

我目前正在尝试使用 ZXing 库在 Windows Phone 7.5 中开发移动条形码阅读器。看到我在这里发帖,你可能已经猜到我遇到了一些我不知道解决办法的问题。

问题如下: ZXing 库允许多种条形码格式 - 但是,我想包含一个设置菜单,让用户专门关注一个条形码。

BarcodeFormat 对象是静态的,包含我要分配的只读成员(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
4

3 回答 3

3

动态获取 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;
于 2012-05-30T10:32:46.250 回答
2

“因为静态属性属于类型,而不是单个对象,所以通过将 null 作为对象参数传递来获取静态属性”

例如 :

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

所以你需要做的就是调用GetProperties()而不是GetMembers()调用GetValue(null, null)来获取值。

于 2012-05-30T10:25:25.047 回答
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;
于 2012-05-30T10:49:12.060 回答