自定义属性能否传递多个属性名参数并获取对应值?
问题描述
我有一个从数据库查询填充数据的视图模型(view model),部分属性被分配了自定义属性。目前我在自定义属性中传递了它所分配的属性的名称,但还想传入另一个属性以获取其值,从而将这两项信息传递到另一个界面。
代码示例:
public int Id {get; set;} [TestAttribute(nameof(Id), nameof(Name))] public string Name {get;set;}
请问这是否可行?我知道如何用自定义验证属性实现,但找不到普通自定义属性的相关方法,因此怀疑这不可行。
可行方案说明
当然可行,核心是在反射读取自定义属性的时候,结合视图模型实例来获取目标属性的值。
步骤拆解
定义自定义属性
先让TestAttribute支持接收两个属性名称参数:[AttributeUsage(AttributeTargets.Property)] public class TestAttribute : Attribute { public string RelatedPropertyName { get; } public string CurrentPropertyName { get; } public TestAttribute(string relatedPropertyName, string currentPropertyName) { RelatedPropertyName = relatedPropertyName; CurrentPropertyName = currentPropertyName; } }读取属性并获取对应值
当需要从视图模型实例中提取信息时,通过反射找到带TestAttribute的属性,再根据属性名称获取对应的值:public static (string CurrentPropValue, object RelatedPropValue) GetAttributeValues<T>(T model) where T : class { var props = typeof(T).GetProperties(); foreach (var prop in props) { var testAttr = prop.GetCustomAttribute<TestAttribute>(); if (testAttr != null) { // 获取当前属性的值 var currentValue = prop.GetValue(model)?.ToString(); // 获取关联属性的值 var relatedProp = typeof(T).GetProperty(testAttr.RelatedPropertyName); var relatedValue = relatedProp?.GetValue(model); return (currentValue, relatedValue); } } return (null, null); }使用示例
假设你的视图模型实例是var vm = new YourViewModel { Id = 1, Name = "TestName" };,调用上述方法就能拿到Name的值和对应的Id值,直接传递到其他界面即可。
注意事项
- 反射操作要做好空值判断,防止因属性不存在或值为null引发异常
- 如果视图模型中有多个带
TestAttribute的属性,需要调整逻辑来处理批量场景
内容的提问来源于stack exchange,提问作者WebbyLass
相关产品推荐
相关产品推荐

