我可以将变量类类型传递给<t> </t>

时间:2014-05-13 07:50:20

标签: c# wpf wpfdatagrid

以下是一个类的示例,该类搜索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;
    }
}

1 个答案:

答案 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()