C#如何通过字符串动态设置属性?

时间:2013-03-21 14:03:25

标签: c# dynamic reflection properties set

首先,我不是编程,但可以找出基本概念 满足我的需求。

在下面的代码中,我想通过名称“Gold”设置属性,如:

_cotreport.Contract = COTReportHelper.ContractType."Blabalbal"


 protected override void OnBarUpdate()
            {

                COTReport _cotreport = COTReport(Input);
                _cotreport.Contract=COTReportHelper.ContractType.Gold;
                _cotreport.OpenInterestDisplay=COTReportHelper.OpenInterestDisplayType.NetPosition;
                double index = _cotreport.Commercial[0];
                OwnSMA.Set(index);

            } 

我尝试了以下代码,但系统说:“

  

未将对象引用设置为对象的实例“

请帮忙!

            System.Reflection.PropertyInfo PropertyInfo = _cotreport.GetType().GetProperty("ContractType");
            PropertyInfo.SetValue(_cotreport.Contract,"Gold",null);
            PropertyInfo.SetValue(_cotreport.Contract,Convert.ChangeType("Gold",PropertyInfo.PropertyType),null);

3 个答案:

答案 0 :(得分:2)

您正尝试在"ContractType"上设置一个名为_cotreport的属性,并将其值设置为_cotreport.Contract。由于两个原因,这不会起作用。

  1. 属性名称(来自我在代码中的含义)是Contract而不是ContractType
  2. 您需要在_cotreport上设置值。
  3. 试试这个

    System.Reflection.PropertyInfo property = _cotreport.GetType().GetProperty("Contract");
    property.SetValue(_cotreport, COTReportHelper.ContractType.Gold, new object[0]);
    

    如果要按名称设置枚举值,则这是一个单独的问题。试试这个

    var enumValue = Enum.Parse(typeof(COTReportHelper.ContractType), "Gold");
    property.SetValue(_cotreport, enumValue, new object[0]);
    

答案 1 :(得分:1)

PropertyInfo可能是null,如果您使用了属性名称,则可能不是ContractCOTReportHelper.ContractType.Gold。您应该能够直接指定PropertyInfo作为值。并指定属性作为要修改的实例,但System.Reflection.PropertyInfo PropertyInfo = _cotreport.GetType().GetProperty("Contract"); PropertyInfo.SetValue(_cotreport, COTReportHelper.ContractType.Gold, null); 表示,您应指定应在其上设置属性值的拥有实例。

这样的事情:

{{1}}

答案 2 :(得分:0)

此方法设置任何对象的属性值,如果赋值成功则返回true:

public static Boolean TrySettingPropertyValue(Object target, String property, String value)
{
        if (target == null)
            return false;
        try
        {
            var prop = target.GetType().GetProperty(property, DefaultBindingFlags);
            if (prop == null)
                return false;
            if (value == null)
                prop.SetValue(target,null,null);
            var convertedValue = Convert.ChangeType(value, prop.PropertyType);
            prop.SetValue(target,convertedValue,null);
            return true;
        }
        catch
        {
            return false;
        }

    }