我需要传递一些类型的属性选择(每次一种类型),假设这是我的类型:
public class Product {
[PrimaryKey]
public long Id { get; set; }
[DisplayName("Name")]
public string Title { get; set; }
[Foreignkey(Schema = "Products", Table = "MajorCategory", Column = "Id")]
[DisplayName("MCat")]
public string MajorCategory { get; set; }
[Foreignkey(Schema = "Products", Table = "Category", Column = "Id")]
[DisplayName("Cat")]
public string Category { get; set; }
public long CategoryId { get; set; }
[BoolAsRadio()]
public bool IsScanAllowed { get; set; }
}
所以我需要一种方法将此类型的属性列表传递给其他类型(目标类型),并使用属性名称和属性,我不需要值,如下面的伪代码:< / p>
List<Property> propertyList = new List<Property>();
propertyList.Add(Product.Id);
PropertyList.Add(Product.Title);
TargetType target = new TargetType();
target.Properties = propertyList;
public class TargetType {
public List<Property> Properties { get; set;}
GetAttributes() {
foreach(Property item in Properties){
Console.WriteLine(item.Name)
//Get Attributes
}
}
}
有没有办法像Product.Id
那样传递并使用它的名称和属性?我不确定,但也许PropertyInfo
可以提供帮助,我想可以通过List of Object但是在这种情况下我不能使用属性和名称,你有什么建议来处理这个问题?或类似的东西?如果我错了,我该如何实施呢?
答案 0 :(得分:1)
好笑,我刚回答了一个类似的问题,或者至少我认为是。
看起来你正在尝试将两种类型的属性连接成一个?你需要一个ExpandoObject:
http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject%28v=vs.100%29.aspx
有关嵌套合并的实现,请参阅:
C# deep/nested/recursive merge of dynamic/expando objects
基本上,您需要一个键控的属性列表,从头开始。以下代码将对任何.NET对象执行此操作:
var props = object.GetType().GetProperties().ToDictionary<PropertyInfo, string>(prop => prop.Name);
之后,它取决于你想要实现的精确内容 - 对象的真实副本,与另一个对象合并,或者只是维护列表。
答案 1 :(得分:1)
您可以在此处使用.NET中的反射:
List<PropertyInfo> propertyList = new List<PropertyInfo>();
Type productType = typeof (Product);
propertyList.Add(productType.GetProperty("Id"));
propertyList.Add(productType.GetProperty("Title"));
TargetType target = new TargetType();
target.Properties = propertyList;
public class TargetType {
public List<PropertyInfo> Properties { get; set;}
List<object> GetAttributes()
{
List<object> attributes = new List<object>();
foreach(PropertyInfo item in Properties)
{
Console.WriteLine(item.Name);
attributes.AddRange(item.GetCustomAttributes(true));
}
return attributes;
}
}
答案 2 :(得分:0)
您可以使用PropertyInfo
,List<PropertyInfo>
列表作为TargetType .Properties
的类型。要获取属性,您可以使用Reflection
尝试这样做。
targetType.Properties = product.GetType().GetProperties().ToList();
答案 3 :(得分:0)
您可以使用表达式树构建属性列表,例如你可以做这样的事情:
var propertiesListBuilder = new PropertiesListBuilder<Product>();
propertiesListBuilder
.AddProperty(_ => _.Id)
.AddProperty(_ => _.Title);
var target = new TargetType();
target.Properties = propertiesListBuilder.Properties;
这里唯一关注的是性能,即一遍又一遍地重新创建这样的属性列表可能不是一个好主意,很可能它们应该被缓存。同时,您将获得智能感知,编译器检查和重构对您的属性列表的支持。
以下是这个内容的示例实现。
static class PropertyInfoProvider<T>
{
public static PropertyInfo GetPropertyInfo<TProperty>(Expression<Func<T, TProperty>> expression)
{
var memberExpression = (MemberExpression)expression.Body;
return (PropertyInfo)memberExpression.Member;
}
}
class PropertiesListBuilder<T>
{
public IEnumerable<PropertyInfo> Properties
{
get
{
return this.properties;
}
}
public PropertiesListBuilder<T> AddProperty<TProperty>(
Expression<Func<T, TProperty>> expression)
{
var info = PropertyInfoProvider<T>.GetPropertyInfo(expression);
this.properties.Add(info);
return this;
}
private List<PropertyInfo> properties = new List<PropertyInfo>();
}
答案 4 :(得分:-1)
typeof(Product).GetProperties()
会将所有(公共)属性视为PropertyInfo[]
。
另见MSDN。