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