0

DynamicObject の子孫である単純なクラスを作成しました。

public class DynamicCsv : DynamicObject
{

    private Dictionary<string, int> _fieldIndex;
    private string[] _RowValues;

    internal DynamicCsv(string[] values, Dictionary<string, int> fieldIndex)
    {
        _RowValues = values;
        _fieldIndex = fieldIndex;
    }

    internal DynamicCsv(string currentRow, Dictionary<string, int> fieldIndex)
    {
        _RowValues = currentRow.Split(',');
        _fieldIndex = fieldIndex;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = null;
        dynamic fieldName = binder.Name.ToUpperInvariant();
        if (_fieldIndex.ContainsKey(fieldName))
        {
            result = _RowValues[_fieldIndex[fieldName]];
            return true;
        }
        return false;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        dynamic fieldName = binder.Name.ToUpperInvariant();
        if (_fieldIndex.ContainsKey(fieldName))
        {
            _RowValues[_fieldIndex[fieldName]] = value.ToString();
            return true;
        }
        return false;
    }

}

次のようにして子孫オブジェクトを使用します。

    protected string[] _currentLine;
    protected Dictionary<string, int> _fieldNames;
...
                _fieldNames = new Dictionary<string, int>();
...
                _CurrentRow = new DynamicCsv(_currentLine, _fieldNames);

_CurrentRow をドット表記で使用しようとすると:

int x = _CurrentRow.PersonId;

次のエラー メッセージが表示されます。

「' object ' には ' property 'の定義が含まれておらず、型 'object' の最初の引数を受け入れる拡張メソッド ' property ' が見つかりませんでした」

ただし、VB を使用してイミディエイト ウィンドウでプロパティを問題なく解決できます。

? _CurrentRow.PersonId
4

2 に答える 2

4

it looks like _CurrentRow is typed to object but that you want dynamic lookup to occur on it. If that's the case then you need to change the type to dynamic

dynamic _CurrentRow;
于 2013-04-02T22:26:16.223 に答える
1

の宣言を表示していません_CurrentRow。次のように宣言する必要があります

dynamic _CurrentRowダイナミックな振る舞いをするために。

于 2013-04-02T22:27:39.743 に答える