0

私は次のコードを持っています:

List<MultiServiceRequestMember> _memberList = new List<MultiServiceRequestMember>();
var type = Type.GetType(svc.NotificationClassName); <- this is a string of the class name.
MultiServiceRequestMember newMember = (MultiServiceRequestMember)Activator.CreateInstance(type);

_memberList.add(newMember);

MultServiceRequestMemberは基本タイプであり、に固有のプロパティに値を割り当てたいと思いますtype。私の質問は、newMemberをキャストして、そのプロパティを入力してアクセスするにはどうすればよいですか?

4

2 に答える 2

3

newMemberをキャストして、そのプロパティを入力してアクセスするにはどうすればよいですか?

コンパイル時に特定のタイプがわからないため、キャストできません。もしそうなら、そもそも反省する必要はないでしょう!

リフレクションによってプロパティを設定する必要もあります。

// TODO: Checking that you managed to get the property, that's it's writable etc.
var property = type.GetProperty("PropertyName");
property.SetValue(newMember, "new value", null);
于 2012-05-06T08:56:53.153 に答える
0

次のようにコードを変更する必要があります。

List<MultiServiceRequestMember> _memberList = new List<MultiServiceRequestMember>();
var type = Type.GetType(svc.NotificationClassName);
MultiServiceRequestMember newMember = null;
if (type == typeof(MultiServiceRequestMemberA))
{
    newMember = new MultiServiceRequestMemberA();
    //set specific properties
}
else if (type == typeof(MultiServiceRequestMemberB)) //etc.
{
    //...
}
else
{
    //throw or some default
}

_memberList.add(newMember);

しかし、それはコードの臭いのように見えます。他のオブジェクトに基づいてオブジェクトを初期化しようとしていると思います(NotificationInfoと呼びましょう)。次に、次のようなコードの代わりに:

if (type == typeof(MultiServiceRequestMemberA))
{
    newMember = new MultiServiceRequestMemberA();
    newMember.A = notificationInfo.A;
}

たぶん、次のデザインを考える必要があります。

class MultiServiceRequestMember
{
    public virtual void Initialize(NotificationInfo notificationInfo) //or abstract if you wish
    {
    }
}

class MultiServiceRequestMemberA : MultiServiceRequestMember
{
    public override void Initialize(NotificationInfo notificationInfo)
    {
        base.Initialize(notificationInfo);
        this.A = notificationInfo.A;
    }
}

その後、前のコードをそのままにして、Initializeを呼び出すことができます。

于 2012-05-06T08:59:02.113 に答える