如何创建通用T类?

时间:2016-08-25 13:08:40

标签: c# asp.net-mvc generics

我在ASP.NET MVC中有两个函数。如何将这些函数转换为Generic类(class)?

public JsonResult CreateProduct(List<Product> Products, List<GroupExpression> GroupExpression)
    {
        List<GroupExpression> InvalidGroupExpression = ValidateColumnInList(Products, GroupExpression);
        if (InvalidGroupExpression.Count() <= 0)
        {
            string[] Fields = GroupExpression.Select(x => x.ExpressionName).ToArray();
            var LambdaExp = GroupExpressionBuilder.GroupByExpression<Product>(Fields);
            IEnumerable<Product> DuplicateProducts = Products.GroupBy(LambdaExp.Compile()).Where(g => g.Skip(1).Any()).SelectMany(g => g).ToList();
            IEnumerable<object> Indices = DuplicateProducts.Select<Product, object>(x => Products.IndexOf(x)).ToList();

            return Json(new { Success = true, Indices }, JsonRequestBehavior.AllowGet);
        }
        else
        {
            //return Json(new { Message = false });
            return Json(new { Success = false, InvalidGroupExpression }, JsonRequestBehavior.AllowGet);
        }            
    }
    public List<GroupExpression> ValidateColumnInList(List<Product> Products, List<GroupExpression> GroupExpression)
    {
        //bool IsValid = true;
        List<GroupExpression> TempGroupExpression = new List<GroupExpression>();
        foreach (var GrpExpression in GroupExpression)
        {
            bool IsContainColumn = typeof(Product).GetProperties().Any(column => column.Name == GrpExpression.ExpressionName);
            if (!IsContainColumn)
            {
                TempGroupExpression.Add(GrpExpression);
                //IsValid = false;
            }
        }
        //GroupExpression.RemoveAll(x => TempGroupExpression.Contains(x));
        //return IsValid;
        return TempGroupExpression;
    }

在上述功能中。我想将List Products,List GroupExpression转换为参数。我是T班的新手。我该怎么做?

2 个答案:

答案 0 :(得分:2)

功能的签名如下。

public JsonResult CreateProduct<T>(List<T> Products,
                                   List<GroupExpression> GroupExpression)
{
}

public List<T> ValidateColumnInList<T>(List<T> Products, 
                                       List<GroupExpression> GroupExpression)
{
}

答案 1 :(得分:0)

根据您的具体情况,您需要注意以下内容:

class SomeClass
{

    public void SomeMethod()
    {
        var groupExpressions = new List<GroupExpression>();
        // populate GroupExpressions somehow
        var validatedGroups = ValidateColumnInList<Product, GroupExpression>(groupExpressions);
    }

    public List<TGroup> ValidateColumnInList<TItem, TGroup>(List<TGroup> GroupExpression) where TGroup: GroupExpression
    {
        List<TGroup> TempGroupExpression = new List<TGroup>();
        var itemProperties = typeof(TItem).GetProperties();
        foreach (var GrpExpression in GroupExpression)
        {
            bool IsContainColumn = itemProperties.Any(column => column.Name == GrpExpression.ExpressionName);
            if (!IsContainColumn)
            {
                TempGroupExpression.Add(GrpExpression);
            }
        }
        return TempGroupExpression;
    }

    public JsonResult CreateProduct<TItem, TGroup>(List<TItem> Products, List<TGroup> GroupExpression) where TGroup : GroupExpression
    {
        List<TGroup> InvalidGroupExpression = ValidateColumnInList<TItem, TGroup>(GroupExpression);
        if (InvalidGroupExpression.Count() <= 0)
        {
            string[] Fields = GroupExpression.Select(x => x.ExpressionName).ToArray();
            var LambdaExp = GroupExpressionBuilder.GroupByExpression<TItem>(Fields);
            IEnumerable<TItem> DuplicateProducts = Products.GroupBy(LambdaExp.Compile()).Where(g => g.Skip(1).Any()).SelectMany(g => g).ToList();
            IEnumerable<object> Indices = DuplicateProducts.Select<TItem, object>(x => Products.IndexOf(x)).ToList();

            return Json(new { Success = true, Indices }, JsonRequestBehavior.AllowGet);
        }
        else
        {
            //return Json(new { Message = false });
            return Json(new { Success = false, InvalidGroupExpression }, JsonRequestBehavior.AllowGet);
        }
    }

}

internal class Product
{
}

internal class GroupExpression 
{
    public string ExpressionName;
}

我从方法参数中删除了List<TItem> items,因为您只使用它的类型来迭代属性并使用它来匹配是否应该验证它。