简体   繁体   中英

How to create generic T class?

I have two functions in ASP.NET MVC. How do I convert these functions to Generic class ( 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;
    }

In the above functions. I wanted to convert List Products, List GroupExpression are into parameters. I am new to T classes. How do I do this?

The signatures for the functions would be as follows.

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

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

To your specific situation you'd be looking up to something like the following:

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;
}

I removed List<TItem> items from the method params since you are only using the type of it to iterate properties and using it against to match whether it should be validated or not.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM