使用.NET设置属性值的通用方法

时间:2011-09-13 16:10:25

标签: c#

我有一百个需要在一个对象中设置的属性,它本质上是分层的,并且想要这样做的通用方法,这是否可行?其中一个驱动原因是错误检查和记录。

在下面的示例中,我将ReferenceModelIdentifier设置为字符串

    public override void Execute(MESSAGE message)
    {
        message.MISMOReferenceModelIdentifier= "3.0.0.263.12";

        Tasks.Add(new AboutVersionsTask(LoanNumber, LoanState));
        Tasks.Add(new DealSetsTask(LoanNumber, LoanState));

        foreach (var task in Tasks)
            using (task)
                task.Execute(message);

        // Were the tasks successful?
        Debug.Assert(message.ABOUT_VERSIONS.ABOUT_VERSION.Count > 0, "ABOUT_VERSION");
        Debug.Assert(message.DEAL_SETS.DEAL_SET.Count > 0, "DEAL_SET");

        Log.Info("Finished Execute");
    }

在本示例中,我将ApplicationReceivedDate设置为另一个MISMODate类型的对象

    public override void Execute(MESSAGE message)
    {
        var node = new LOAN_DETAIL();

        var con = GetOpenConnection();
        string sql;
        IEnumerable<dynamic> data;
        dynamic first;

        if (LoanState == LoanStateEnum.AtClosing)
        {
            //(224) ApplicationReceivedDate
            sql = @"
                SELECT date ApplicationReceivedDate 
                FROM   foo (nolock) 
                WHERE  loannum = @loannum";

            data = con.Query<dynamic>(sql, new { loannum = new DbString { Value = LoanNumber, IsFixedLength = true, Length = 15, IsAnsi = true } });

            first = data.First();
            node.ApplicationReceivedDate = new MISMODate { TypedValue = first.ApplicationReceivedDate.ToString("yyyy-MM-dd") };
        }
    }

我开始编码的内容与

类似
    protected void SetValue(Object property, Object value)
    {

    }

,用法是

    SetValue(message.MISMOReferenceModelIdentifier, "3.0.0.263.12");

修改

我最终做的是这个

    protected void SetValue(object theObject, string theProperty, object theValue)
    {
        try
        {
            var msgInfo = theObject.GetType().GetProperty(theProperty);
            msgInfo.SetValue(theObject, theValue, null);

        }
        catch (Exception e)
        {
           Log(e);
        }
    }

并且用法是

SetValue(message, "MISMOReferenceModelIdentifier", "3.0.0.263.12");

谢谢你, 斯蒂芬

2 个答案:

答案 0 :(得分:12)

您可以迭代对象图并使用反射设置属性值:

object obj; // your object

Type t = obj.GetType();
foreach (var propInfo in t.GetProperties())
{
    propInfo.SetValue(obj, value, null);
}

如果您可以确保您的类属性具有getter,则可以递归迭代对象图:

public static void setValsRecursive(object obj, object value)
{
    Type t = obj.GetType();
    foreach (var propInfo in t.GetProperties())
    {
        if (propInfo.PropertyType.IsClass)
        {
            object propVal = propInfo.GetValue(obj, null);
            setValsRecursive(propVal, value);
        }
        propInfo.SetValue(obj, value, null);
    }
}   

这是一个愚蠢的函数,它将每个属性设置为相同的值......

答案 1 :(得分:1)

您可以使用PropertyInfo以通用方式动态设置值。