我有这个POCO类,其属性使用自定义属性:
应用程序状态标志POCO类
public class ApplicationStatusFlags
{
public int ApplicationId { get; set; }
[SectionFlag("APPLICANTPERSONALDETAILS")]
public bool PersonalDetailsStatus { get; set; }
[SectionFlag("APPLICANTECREGISTRATION")]
public bool EcRegistrationStatus { get; set; }
[SectionFlag("APPLICANTCV")]
public bool CvUpload { get; set; }
[SectionFlag("APPLICANTSTATEMENT")]
public bool IceAttributeStatement { get; set; }
[SectionFlag("APPLICANTCPD")]
public bool CpdUpload { get; set; }
[SectionFlag("APPLICANTORGCHART")]
public bool OrgChartUpload { get; set; }
[SectionFlag("APPLICANTSPONSORDETAILS")]
public bool SponsorDetails { get; set; }
}
部分标记属性类
[AttributeUsage(AttributeTargets.All)]
public class SectionFlagAttribute : Attribute
{
/// <summary>
/// This constructor takes name of attribute
/// </summary>
/// <param name="name"></param>
public SectionFlagAttribute(string name)
{
Name = name;
}
public virtual string Name { get; }
}
我试图通过使用带有节标记名称的字符串来获取这些属性之一的值。
因此,如果var foo = "APPLICANTSPONSORDETAILS"
,我将得到SponsorDetails
的布尔值。
示例代码
updateAppStatusFlag.ApplicationId = applicationId;
var applicationStatuses =
await _applicationService
.UpdateApplicationStatusFlagsAsync<ApplicationStatusFlags>(updateAppStatusFlag);
var foo = "APPLICANTSPONSORDETAILS";
var type = applicationStatuses.GetType();
var test = type.
GetCustomAttributes(false)
.OfType<SectionFlagAttribute>()
.SingleOrDefault()
?.Name == foo;
任何想法如何做到这一点?我知道我可以使用反射功能,但是在使其正常工作时遇到了问题。
谢谢
答案 0 :(得分:2)
在您的示例中,您获取的是类的自定义属性,而不是属性。
这里是一个例子:
private object GetValueBySectionFlag(object obj, string flagName)
{
// get the type:
var objType = obj.GetType();
// iterate the properties
var prop = (from property in objType.GetProperties()
// iterate it's attributes
from attrib in property.GetCustomAttributes(typeof(SectionFlagAttribute), false).Cast<SectionFlagAttribute>()
// filter on the name
where attrib.Name == flagName
// select the propertyInfo
select property).FirstOrDefault();
// use the propertyinfo to get the instance->property value
return prop?.GetValue(obj);
}
注意:这将仅返回第一个属性,该属性包含具有正确名称的SectionFlagAttribute。您可以修改该方法以返回多个值。 (如属性名称/值的集合)
用法:
// a test instance.
var obj = new ApplicationStatusFlags { IceAttributeStatement = true };
// get the value by SectionFlag name
var iceAttributeStatement = GetValueBySectionFlag(obj, "APPLICANTSTATEMENT");
如果返回的值为null
,则找不到该标志或该属性的值为空。