数据类公共属性为Dictionary

时间:2014-08-01 08:01:45

标签: c# linq dictionary

我使用以下代码将我的类的公共属性转换为Dictionary:

public static Dictionary<string, object> ClassPropsToDictionary<T>(T classProps)
{
     return classProps.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
                .ToDictionary(prop => prop.Name, prop => prop.GetValue(classProps, null));            
}

这很好但我不想要班级的参考成员:

public class Unit
{
    public virtual string Description { get; set; } // OK
    public virtual Employee EmployeeRef { get; set; } // DONT WANT THIS
}

我需要哪个绑定标志来避免EmployeeRef成员?

由于

3 个答案:

答案 0 :(得分:5)

WhereIsClass属性一起使用:

classProps
.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(x => !x.PropertyType.IsClass)
.ToDictionary(prop => prop.Name, prop => prop.GetValue(classProps, null));  

没有BindingFlag。大多数BindingFlags与访问修饰符和继承层次结构等相关。不能指定它们来消除值类型或引用类型。如果您不想删除string之类的内置类型,则声明一个数组,将所有类型放入其中,然后使用Contains

var allowedTypes = new [] { typeof(string), ... };

.Where(x => !x.PropertyType.IsClass || allowedTypes.Contains(x.PropertyType))

由于大多数内置类型都位于System命名空间中,因此您也可以简化此操作:

.Where(x => !x.PropertyType.IsClass || 
             x.PropertyType.AssemblyQualifiedName.StartsWith("System"))

答案 1 :(得分:2)

public static Dictionary<string, object> ClassPropsToDictionary<T>(T classProps)
{
    return classProps.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(pi => !pi.PropertyType.IsClass || pi.PropertyType == typeof(string))
               .ToDictionary(prop => prop.Name, prop => prop.GetValue(classProps, null));
}

答案 2 :(得分:0)

你想要包含结构吗?你也可以查看IsPrimitive标志,即使String也是一个对象,所以你必须单独包含它

classProps.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(x => x.PropertyType.IsPrimitive || x.PropertyType == typeof(string));