为通用参数指定构造函数约束

发布于 2024-09-13 01:49:38 字数 441 浏览 8 评论 0原文

我有一个对象集合,我将其作为参数传递以创建另一种类型的对象(一对一)。我在很多地方都这样做(基本上是从数据对象转换为业务对象)。我想编写一个通用扩展方法来完成此任务。但我陷入困境,因为我不知道如何指定业务对象具有以数据对象作为参数的构造函数的约束。以下是我的函数的代码:

public static IList<T> ConvertTo<A,T>(this IEnumerable<A> list) 
                    where T : new(A)/*THIS IS PROBLEM PART*/
{
    var ret = new List<T>();

    foreach (var item in list)
    {
        ret.Add(new T(item));
    }
    return ret;
}

I have a collection of objects which I pass as parameter to create objects of another type (one for one). I am doing this in many places (basically converting from data objects to business objects). I want to write a generic extension method to accomplish this. But I am stuck because I don't know how I can specify constraint that business object has a constructor taking data object as parameter. Following is code of my function:

public static IList<T> ConvertTo<A,T>(this IEnumerable<A> list) 
                    where T : new(A)/*THIS IS PROBLEM PART*/
{
    var ret = new List<T>();

    foreach (var item in list)
    {
        ret.Add(new T(item));
    }
    return ret;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

念﹏祤嫣 2024-09-20 01:49:38

不幸的是,这在 C# 中是不允许的。您可以使用 new() 约束强制类型具有默认构造函数,但这是 .NET 支持的唯一与构造函数相关的约束。

您最好的选择可能是定义一个您可以使用的接口,并限制该接口。您可以使用“初始化”样式的方法来获取“A”对象并调用它,而不是尝试在构造时设置对象。

Unfortunately, this isn't allowed in C#. You can have a new() constraint that forces the type to have a default constructor, but that is the only constructor related constraint supported by .NET.

Your best option is probably to define an interface you can use, and constrain to the interface. Instead of trying to set the object at construction, you can have an "Initialize" style method that takes the "A" object, and call that.

酸甜透明夹心 2024-09-20 01:49:38

您不能以这种方式约束泛型类型构造函数(仅需要无参数构造函数),但您可以采用委托来进行构造:

public static IList<T> ConvertTo<A, T>(this IEnumerable<A> list, Func<A, T> constructionFunc)
{
    return list.Select(constructionFunc).ToList();
}

并像这样使用它:

var IList<T> converted = someSequence.ConvertTo(a => new T(a));

You can't constrain generic type constructors in this way (only to require a parameterless constructor), but you could take a delegate to do the construction:

public static IList<T> ConvertTo<A, T>(this IEnumerable<A> list, Func<A, T> constructionFunc)
{
    return list.Select(constructionFunc).ToList();
}

And use it like this:

var IList<T> converted = someSequence.ConvertTo(a => new T(a));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文