0

変数の値を変更しようとしていますが、変数の名前が文字列としてしかありません。これは一般的に理想的ではないことは理解していますが、私の状況では必要であると想定してください。変更したい変数はタイプElementで、作成したクラスは次のようになります。

public class Element
    {
        public string TopBoundReplace;
        public string RightBoundReplace;
        public string BottomBoundReplace;
        public List<string> ConfidenceString {get; set;}
        public string LeftBoundReplace { get; set; }
        public string Regex { get; set; }
        public string ReplaceString { get; set; }
        public List<int> LeftBound { get; set; }
        public List<int> TopBound { get; set; }
        public List<int> BottomBound { get; set; }
        public List<int> RightBound { get; set; }
        public string Whitelist { get; set; }
        public List<System.Drawing.Rectangle> Rectangle { get; set; }
        public System.Drawing.Rectangle SourceBox { get; set; }
        public List<string> Value { get; set; }

        public Element()
            : this("", "", "", new List<int>(), new List<int>(), new List<int>(),new List<int>(), "", new List<Rectangle>(), new System.Drawing.Rectangle(), new List<string>(), new List<string>())
        {
        }
        public Element(string leftBoundReplace, string regex, string replaceString, List<int> leftBound, List<int> topBound, List<int> bottomBound, List<int> rightBound, string whitelist, List<System.Drawing.Rectangle> rectangle, System.Drawing.Rectangle sourceBox, List<string> value, List<string> confidenceString)
        {
            Regex = regex;
            ReplaceString = replaceString;
            LeftBound = leftBound;
            TopBound = topBound;
            BottomBound = bottomBound;
            RightBound = rightBound;
            Whitelist = whitelist;
            Rectangle = rectangle;
            SourceBox = sourceBox;
            Value = value;
            LeftBoundReplace = leftBoundReplace;
            ConfidenceString = confidenceString;
        }
    }

Elementsは、ocrVarと呼ばれる別のクラスで初期化されます。これは次のようになります(この質問の目的でトリミングされています)。

public class ocrVar
{
    public static Element DueDate = new Element();
    public static Element AmountDue = new Element();
    public static Element BillDate = new Element();
}

したがって、通常は、次のようにして問題の値を編集します。

ocrVar.DueDate.Value[0] = "10/25/2012";

文字列値だけを変数名としてこれを行うにはどうすればよいですか?私はいくつかのReflectionのものを試しました:

Type myType = ocrVar.BillDate.GetType();
PropertyInfo myPropInfo = myType.GetProperty("DueDate");

myTypeは最終的に正しいタイプ(Element)を取得しますが、「DueDate」はクラスのプロパティではなく、Elementクラスのプロパティであるため、上記のコードを実行するとmyPropInfoはnullのままになりますocrVar。上記のコードのようなことを実行して、DueDateの値を取得し、値をElement操作してから、それらをocrVar.DueDateに戻すことができます。

4

3 に答える 3

2

はプロパティではなくフィールドであるため、FieldInfoandGetFieldの代わりにPropertyInfoandを使用する必要があります。GetPropertyocrVar.DueDate

このコードは、ocrVar.DueDateフィールドをElement変数に入れます。それはあなたがやりたいことですか?

Type myType = typeof(ocrVar);
FieldInfo myPropInfo = myType.GetField("DueDate");
Element value = (Element)myPropInfo.GetValue(null);  // null because it's static
于 2012-09-12T21:24:13.150 に答える
1

うーん..コードは次のようになります。

    Type myType = ocrVar.GetType();      
    PropertyInfo myPropInfo = myType.GetProperty("DueDate", BindingFlags.Static | BindingFlags.Public);

修正

申し訳ありませんが、テストしました。(ちなみに、フィールドでは「GetProperty」の代わりに「GetField」を使用します)。正しいコードは次のとおりです。

public class ocrVar
{
    static ocrVar()
    {
        DueDate = new Element();
        AmountDue =new Element();
        BillDate = new Element();
    }

    public static Element DueDate { get;private set; }
    public static Element AmountDue { get; private set; }
    public static Element BillDate { get; private set; }
}

使い方:

    private static void Test()
    {
        ocrVar ocrVar = new ocrVar();
        Type myType = ocrVar.GetType();
        PropertyInfo myPropInfo = myType.GetProperty("DueDate", BindingFlags.Static | BindingFlags.Public);
    }
于 2012-09-12T21:07:14.327 に答える
0

プロパティ検索時のデフォルトのバインディングフラグは。であるため、GetPropertyはnullを返しますBindingFlags.Instance | BindingFlags.Public。プロパティは静的であるため、次のものが必要です。

PropertyInfo myPropInfo = myType.GetProperty("DueDate", BindingFlags.Static | BindingFlags.Public);
于 2012-09-12T21:04:25.877 に答える