访问由反射创建的类型的属性
本文关键字:类型 属性 创建 反射 访问 | 更新日期: 2023-09-27 18:33:23
我有以下代码:
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 以键入和访问其属性?
如何强制转换 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);
您必须将代码更改为如下所示:
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);
但是,它看起来像代码气味。我猜您正在尝试基于其他对象初始化对象(我们称之为通知信息)。然后而不是看起来像这样的代码:
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;
}
}
然后,您将能够保留以前的代码并调用初始化。