首先,我不喜欢编程,但可以理解基本概念满足我的需求。
在下面的代码中,我想通过名称"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);
您正试图在_cotreport
上设置一个名为"ContractType"
的属性,并在_cotreport.Contract
上设置其值。这行不通,有两个原因。
- 属性名称(根据我在代码中的判断(是
Contract
,而不是ContractType
- 您需要设置
_cotreport
上的值
试试这个
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]);
PropertyInfo
可以是null
,如果使用属性名称:Contract
,则可能不是。您应该能够直接将COTReportHelper.ContractType.Gold
指定为值。您将属性指定为要修改的实例,但PropertyInfo
表示,您应该指定应该在其上设置属性值的所属实例。
类似这样的东西:
System.Reflection.PropertyInfo PropertyInfo = _cotreport.GetType().GetProperty("Contract");
PropertyInfo.SetValue(_cotreport, COTReportHelper.ContractType.Gold, null);
此方法设置任何对象的属性值,如果赋值成功则返回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;
}
}