在C#中,如何动态获取静态类的成员?

时间:2012-05-30 09:53:32

标签: c# reflection static member

我目前正在尝试使用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

3 个答案:

答案 0 :(得分: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)来获取价值。

答案 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;