私がやろうとしているのは、文字列を使用してクラスのプロパティの値を設定することです。たとえば、私のクラスには次のプロパティがあります。
myClass.Name
myClass.Address
myClass.PhoneNumber
myClass.FaxNumber
すべてのフィールドはstring
タイプであるため、常に文字列であることを事前に知っています。ここで、DataSet
オブジェクトでできるように、文字列を使用してプロパティを設定できるようにしたいと思います。このようなもの:
myClass["Name"] = "John"
myClass["Address"] = "1112 River St., Boulder, CO"
理想的には、変数を割り当ててから、変数の文字列名を使用してプロパティを設定するだけです。
string propName = "Name"
myClass[propName] = "John"
私はリフレクションについて読んでいたのかもしれませんが、それを行う方法かもしれませんが、クラスでプロパティへのアクセスを損なわずに設定する方法がわかりません。私はまだ使用できるようにしたい:
myClass.Name = "John"
コード例は本当に素晴らしいでしょう。
インデクサープロパティ、擬似コードを追加できます。
public class MyClass
{
public object this[string propertyName]
{
get{
// probably faster without reflection:
// like: return Properties.Settings.Default.PropertyValues[propertyName]
// instead of the following
Type myType = typeof(MyClass);
PropertyInfo myPropInfo = myType.GetProperty(propertyName);
return myPropInfo.GetValue(this, null);
}
set{
Type myType = typeof(MyClass);
PropertyInfo myPropInfo = myType.GetProperty(propertyName);
myPropInfo.SetValue(this, value, null);
}
}
}
クラスにインデクサーを追加し、リフレクションを使用してプロパティをエースできます。
using System.Reflection;
public class MyClass {
public object this[string name]
{
get
{
var properties = typeof(MyClass)
.GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var property in properties)
{
if (property.Name == name && property.CanRead)
return property.GetValue(this, null);
}
throw new ArgumentException("Can't find property");
}
set {
return;
}
}
}