通过使用不同属性类型的反射设置对象的属性

时间:2009-05-14 11:17:56

标签: c# reflection properties runtime

我使用反射来填充对象的属性。

这些属性有不同的类型:String,Nullable(double)和Nullable(long)(不知道如何在这里转义尖括号......)。这些属性的值来自(字符串,对象)对的字典。

因此,例如我的类具有以下属性:

string Description { get; set; } 
Nullable<long> Id { get; set; }
Nullable<double> MaxPower { get; set; }

(实际上存在大约十二个属性)并且字典将具有诸如&lt;“Description”,“A description”&gt;,&lt;“Id”,123456&gt;,&lt;“MaxPower”,20000&gt;的条目。

现在我正在使用以下内容来设置值:

foreach (PropertyInfo info in this.GetType().GetProperties())
{
    if (info.CanRead)
    {
         object thisPropertyValue = dictionary[info.Name];

         if (thisPropertyValue != null && info.CanWrite)
         {
             Type propertyType = info.PropertyType;

             if (propertyType == typeof(String))
             {
                 info.SetValue(this, Convert.ToString(thisPropertyValue), null);
             }
             else if (propertyType == typeof(Nullable<double>))
             {
                 info.SetValue(this, Convert.ToDouble(thisPropertyValue), null);
             }
             else if (propertyType == typeof(Nullable<long>))
             {
                 info.SetValue(this, Convert.ToInt64(thisPropertyValue), null);
             }
             else
             {
                 throw new ApplicationException("Unexpected property type");
             }
         }
     }
}

所以问题是:在分配值之前,我真的必须检查每个属性的类型吗?有什么类似我可以执行的强制转换,以便为属性值分配相应属性的类型吗?

理想情况下,我希望能够做一些喜欢以下的事情(我天真以为可能有用):

         if (thisPropertyValue != null && info.CanWrite)
         {
             Type propertyType = info.PropertyType;

             if (propertyType == typeof(String))
             {
                 info.SetValue(this, (propertyType)thisPropertyValue, null);
             }
        }

谢谢,  斯特凡诺

1 个答案:

答案 0 :(得分:10)

如果值已经是正确的类型,那么否:您不必做任何事情。如果它们可能不对(int vs float等),一个简单的方法可能是:

编辑调整为空值)

Type propertyType = info.PropertyType;
if (thisPropertyValue != null)
{
    Type underlyingType = Nullable.GetUnderlyingType(propertyType);
    thisPropertyValue = Convert.ChangeType(
        thisPropertyValue, underlyingType ?? propertyType);
}
info.SetValue(this, thisPropertyValue, null);