使用expressions/lambda设置属性值的通用方法

Ric*_*y G 5 .net c# linq generic-list

我试图找到一种通用的方法来为lambda表达式指定的属性赋值,查看下面的示例代码,ConverToEntities方法的签名将如何显示以及如何调用?

static void Main()
{
    List<long> ids = new List<long> {1, 2, 3};

    //Non generic way
    List<Data> dataItems = ids.ConvertToDataItems();

    //Generic attempt!!
    List<Data> differntDataItems =
        ids.ConvertToEntities<Data>( p => p.DataId );
}

public class Data
{
    public long DataId;
    public string Name;
}

public static class ExtensionMethods
{
    public static List<Data> ConvertToDataItems(this List<long> dataIds)
    {
        return dataIds.Select(p => new Data { DataId = p }).ToList();
    }

    public static List<T> ConvertToEntities<TProp>(
        this List<long> entities, Func<TProp> lambdaProperty )
    {
        return entities.Select(p => new T {lambdaProperty} ).ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ork*_*zen 4

好的。我能得到的最接近的是:

 class Program
    {
        static void Main(string[] args)
        {
            List<long> ids = new List<long> { 1, 2, 3 };

            //Non generic way
            List<Data> dataItems = ids.ConvertToDataItems();

            //Generic attempt!!

            Func<long, Data> selector = (p => new Data { DataId = p });
            List<Data> differntDataItems = ids.ConvertToEntities<Data>(selector);
        }
    }

    public class Data
    {
        public long DataId;
        public string Name;
    }

    public static class ExtensionMethods
    {
        public static List<Data> ConvertToDataItems(this List<long> dataIds)
        {
            return dataIds.Select(p => new Data { DataId = p }).ToList();
        }

        public static List<TProp> ConvertToEntities<TProp>(this List<long> entities, Func<long, TProp> selector)
        {
            return entities.Select(selector).ToList();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这有效。

我觉得你对你真正想要的返回类型有点困惑。如果能够在方法调用中指定我们想要的内容,那就太酷了。例如:

    public static List<TProp> ConvertToEntities<T, TProp>(List<T> entities, Func<T, TProp> selector)
    {
        return entities.Select(selector).ToList();
    }
Run Code Online (Sandbox Code Playgroud)

这为我们提供了返回类型的更大灵活性。但由于我们使用扩展来做到这一点,我认为这是不切实际的,因为我们需要知道我们要扩展什么类型:

this List<long> entities,
Run Code Online (Sandbox Code Playgroud)

好问题。

编辑代码建议修复。