如何解决创建具有属性子集的对象及其来自另一个对象的值
考虑以下课程-
public class User
{
[Selected]
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
[Selected]
public int Code { get; set; }
public object GetValue()
{
// need to do something here
}
}
[Selected]
只是标记属性。我希望GetValue
方法返回一个对象,该对象将具有带有相应值的[Selected]
标记的属性。也就是说,在下面的代码中-
private static void Execute()
{
User user = new User
{
Name = "alice",Email = "alice@liddell.com",Password = "123456",Code = 1234
};
var value = user.GetValue();
}
value
应该是具有两个属性Name
和Code
的对象,这两个属性分别应具有值"alice"
和1234
。
经过一番搜索,我尝试了ExpandoObject
(以前从未使用过)-
public object GetValue()
{
var dictionary = this.GetType().GetProperties().Where(p => p.GetCustomAttribute(typeof(Selected),false) != null).ToDictionary(p => p.Name);
dynamic expando = new ExpandoObject();
foreach (var item in dictionary)
{
object value = item.Value.GetValue(this);
((IDictionary<string,object>)expando).Add(item.Key,value);
}
return expando;
}
但这没有达到我的目的-value
对象的客户/消费者某种程度上无法读取/访问属性值。
有什么建议吗?
编辑:
可能有很多类似User
的类,并且GetValue
方法将在通用方法中调用。因此,在运行时,我无法知道对象是什么类型以及标记了哪些属性。
解决方法
要通过名称访问字段,将返回的对象强制转换为IDictionary更容易:
var value = (IDictionary<string,object>) user.GetValue();
Console.WriteLine(value["Name"]);
,
将您的方法简化为:
public Dictionary<string,object> GetValue()
{
var dictionary = this.GetType()
.GetProperties()
.Where(p => p.GetCustomAttribute(typeof(Selected),false) != null)
.ToDictionary(p => p.Name,p => p.GetValue(this));
return dictionary;
}
使用:
var value = user.GetValue(); // value is Dictionary
foreach (var kvp in value)
{
Console.WriteLine(kvp);
}
如果您希望POCO,则可以按照以下步骤操作
public class User
{
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public int Code { get; set; }
public SelectedUserProperties GetValue()
{
return new SelectedUserProperties
{
Name = Name,Code = Code
};
}
}
public class SelectedUserProperties
{
public string Name { get; set; }
public int Code { get; set; }
}
假定在编译之前预先知道所选属性。
这样就不需要标记属性,可以将其完全删除。
您所做的很好,在调用方法GetValue
时只需使用关键字dynamic。
dynamic value = user.GetValue();
如果您使用的是 var ,则value
的类型将与编译时函数的返回类型(即object
)相同。因此,如果尝试执行value.Name
,则编译器将不允许这样做,因为类Object
没有任何属性Name
。
动态告诉您的程序在运行时进行类型检查。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。