0

現在、ZXingライブラリを使用してWindowsPhone7.5でモバイルバーコードリーダーを開発しようとしています。私がここに投稿しているのを見て、あなたは私が解決策を知らないある種の問題に直面していることをすでに推測しているかもしれません。

問題は次のとおりです。ZXingライブラリでは複数のバーコード形式を使用できますが、ユーザーが1つのバーコードに特に焦点を合わせるための設定メニューを含めたいと思います。

BarcodeFormat-objectは静的であり、割り当てたい読み取り専用メンバー(BarcodeFormatタイプ)が含まれています。

リフレクションがこのようなダイナミックな振る舞いのための強力な武器であることを見て聞いて、私はそれを試してみようと思いました。

これまでのところ、ZXingを使用してすべての可能な形式を取得するコードがあります

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

これは、フォーマットの名前を取得するために機能します。つまり、リストに名前を正常に表示できます。しかし、これらの形式を実際のリーダーに割り当てようとすると、MemberInfoしかなく、BarcodeFormatがなくなったため、問題が発生します。

これまでのところ、ユーザーが変数に動的にアクセス(設定/取得)したい例のみを見つけました。しかし、提案された解決策は私の問題に適合していないようでした-少なくとも、それらの方法でフォーマットを割り当てる方法は見つかりませんでした。

どんな助けでも素晴らしいでしょう:)どうもありがとうございました。

編集:BarcodeFormatは次のように使用されます:

WP7BarcodeManager.ScanMode = BarcodeFormat.ITF;

この例では、ITF(5つのうち2つがインターリーブされている)形式のバーコードのみが受け入れられます。

私はこれまでに次のアプローチを試しました。

元のBarcodeFormatオブジェクトの代わりにMemberInfoオブジェクトを割り当てるだけです。

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

なぜあなたが反射に苦労するのか、私には完全には理解できません。

次のようにバーコードの種類を列挙できます (ダミー コードは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;
于 2012-05-30T10:49:12.060 に答える