以下是一个类的示例,该类搜索DataGrid
中的项目以查找其属性值中的文本匹配项。我目前称之为:
FullTextSearchNext<UserViewModel>.FullTextSearchInit();
以上<UserViewModel>
硬编码是我ItemsSource
中的DataGrid
所包含的内容。澄清一下:该集合由UserViewModel
个项目组成。
我想知道的是,有没有办法从UserViewModel
获取项目类(DataGrid
),并用某种变量替换硬编码的<UserViewModel>
?因此,我调用ClassPropertySearch
泛型以及类本身。
public static class ClassPropertySearch<T>
{
public static bool Match(T item, string searchTerm)
{
bool match = _properties.Select(prop => prop(item)).Any(value => value != null && value.ToLower().Contains(searchTerm.ToLower()));
return match;
}
private static List<Func<T, string>> _properties;
public static void FullTextSearchInit()
{
_properties = GetPropertyFunctions().ToList();
}
}
[编辑]
这是为了展示更多我最初应该做的课程
包括Marius&#39;解决方案:
现在&lt; T&gt;从ClassPropertySearch中删除其他函数,如GetPropertyFunctions等,不起作用,我应该将类型作为参数传递给它们吗?
public static class ClassPropertySearch
{
public static bool Match(Type itemType, string searchTerm)
{
bool match = _properties.Select(prop => prop(itemType)).Any(value => value != null && value.ToLower().Contains(searchTerm.ToLower()));
return match;
}
private static List<Func<Type, string>> _properties;
public static void FullTextSearchInit(List<string> binding_properties)
{
_properties = GetPropertyFunctions().ToList();
}
public static IEnumerable<Func<Type, string>> GetPropertyFunctions()
{
return GetStringPropertyFunctions();
}
public static IEnumerable<Func<Type, string>> GetStringPropertyFunctions()
{
var propertyInfos = typeof(Type).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.SetProperty)
.Where(p => p.PropertyType == typeof(string)).ToList();
var properties = propertyInfos.Select(GetStringPropertyFunc);
return properties;
}
public static Func<Type, string> GetStringPropertyFunc(PropertyInfo propInfo)
{
ParameterExpression x = System.Linq.Expressions.Expression.Parameter(typeof(Type), "x");
Expression<Func<Type, string>> expression = System.Linq.Expressions.Expression.Lambda<Func<Type, string>>(System.Linq.Expressions.Expression.Property(x, propInfo), x);
Func<Type, string> propertyAccessor = expression.Compile();
return propertyAccessor;
}
}
答案 0 :(得分:3)
您可以使用T
类型替换通用类型Type
。
public static class ClassPropertySearch
{
public static bool Match(Type itemType, string searchTerm)
{
bool match = _properties.Select(prop => prop(itemType)).Any(value => value != null && value.ToLower().Contains(searchTerm.ToLower()));
return match;
}
private static List<Func<Type, string>> _properties;
public static void FullTextSearchInit()
{
_properties = GetPropertyFunctions().ToList();
}
}
因此,您将通过UserViewModel
而不是传递typeof(UserViewModel)
。当然,由于您需要在运行时使用它,因此需要说obj.GetType()
。