当用作类型参数时,有没有办法将参数传递给类构造函数?

jpsqr

我试图使我的代码尽可能可重用,但在尝试将构造函数参数传递给用作类型参数的类时遇到了问题。

我目前拥有的是:

    public sealed class SubmitForm : DerivedClass
    {            
    }

    public void TestMethod_Simulated()
    {
        var foo = GetObject<SubmitForm>();
        SubmitData(foo);
    }

    private void SubmitData(SubmitForm form)
    {
        // Do work 
    }

    public T GetObject<T>()
        where T : class
    {
        // Work
    }

这是有效的,因为 SubmitForm 没有显式构造函数和参数。但是,我想扩展功能并需要一个显式构造函数,该构造函数需要一个参数。

添加构造函数后,我希望使用类型参数“SubmitForm”调用“GetObject”,包括其显式构造函数的参数。

这显然不可能以任何直接的方式进行,但我不想相信没有办法让它发挥作用。

下面显示了我想要实现的目标,即在实例化类时将该类用作类型参数,以便访问我创建的构造函数:

    public sealed class SubmitForm : DerivedClass
    {
        public SubmitForm(EnumType typeVar)
        {
            _derivedVar = typeVar;
        }
    }

    public void TestMethod_Simulated()
    {
        var foo = GetObject<new SubmitForm(EnumType.FormA)>();
        SubmitData(foo);
    }

    private void SubmitData(SubmitForm form)
    {
        // Do work 
    }

    public T GetObject<T>()
        where T : class
    {
        // Work
    }

我希望这是有道理的。我似乎找不到首先实例化类然后将其用作类型参数的方法。

法比安

我希望这是有道理的。我似乎找不到首先实例化类然后将其用作类型参数的方法

好吧,不可能将实例作为泛型类型参数传递类型参数只是对象类型的占位符编译器使用它来推断类型并替换T为真实类型。它与实际参数无关。

如果要SubmitForm在函数中使用特定的实例,可以先创建一个实例:

var submitForm = new SubmitForm(EnumType.FormA);

然后更改您的函数以接受类型的参数T

public T GetObject<T>(T instance)
    where T : class
{
   // .. do something with instance
}

现在您可以调用新的重载:

var someResult = GetObject(submitForm);

但是,从您的代码示例中,您根本不清楚为什么需要泛型类型参数。看来你也可以把GetObject函数的签名T GetObject<T>()改为SubmitForm GetObject(SubmitForm form)

当我们有一个泛型函数需要对不同类型执行或多或少相同的逻辑并且我们不想重复相同的代码时,我们通常会使用类型参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有办法将变量从awk语句传递给bash函数作为参数?

来自分类Dev

有没有办法调用作为参数传递的元素的函数?

来自分类Dev

有没有办法调用作为参数传递的元素的函数?

来自分类Dev

有没有办法遍历传递给Elixir中的函数的所有参数?

来自分类Dev

有没有办法将相同的值传递给函数的所有参数?

来自分类Dev

有没有办法很好地跟踪传递给类的参数变量

来自分类Dev

有没有办法将方法作为参数传递给方法?

来自分类Dev

有没有办法将参数传递给optuna中的多个作业?

来自分类Dev

有没有办法将数组参数传递给管道?

来自分类Dev

有没有办法将方法作为参数传递给方法?

来自分类Dev

有没有办法将网格名称或参数传递给点击事件?

来自分类Dev

有没有办法将函数作为宏的参数传递?

来自分类Dev

有没有办法防止在我的命名参数构造函数中传递未定义?

来自分类Dev

有没有办法将额外的参数传递给 List.ConvertAll 中的转换器

来自分类Dev

有没有办法引用类型的构造函数?

来自分类Dev

有没有办法让“make_unique<T[]>”可以将参数转发给T的构造函数?

来自分类Dev

有没有办法传递带有泛型参数的函数指针?

来自分类Dev

有没有办法将范围传递给指令templateUrl:函数?

来自分类Dev

有没有办法将多个函数传递给AngularJS指令?

来自分类Dev

有没有办法将函数从objective-c++传递给标准c++?

来自分类Dev

有没有办法将哈希数组传递给 Chef 中的提供程序函数

来自分类Dev

当没有__init__方法时,为什么此代码将参数传递给构造函数?

来自分类Dev

有没有办法通过dplyr的`do`函数传递附加参数的向量?

来自分类Dev

有没有办法确定模板类的模板参数类型?

来自分类Dev

有没有办法根据模板参数的类型在不同的类实现之间进行选择?

来自分类Dev

有没有一种“干净”的方法可以将大量(例如20多个)参数传递给类构造函数?

来自分类Dev

Rust:有没有办法在宏类型参数上调用静态函数?

来自分类Dev

Laravel。有没有办法将API资源作为参数传递?

来自分类Dev

有没有办法将命名函数参数转换为 dict

Related 相关文章

  1. 1

    有没有办法将变量从awk语句传递给bash函数作为参数?

  2. 2

    有没有办法调用作为参数传递的元素的函数?

  3. 3

    有没有办法调用作为参数传递的元素的函数?

  4. 4

    有没有办法遍历传递给Elixir中的函数的所有参数?

  5. 5

    有没有办法将相同的值传递给函数的所有参数?

  6. 6

    有没有办法很好地跟踪传递给类的参数变量

  7. 7

    有没有办法将方法作为参数传递给方法?

  8. 8

    有没有办法将参数传递给optuna中的多个作业?

  9. 9

    有没有办法将数组参数传递给管道?

  10. 10

    有没有办法将方法作为参数传递给方法?

  11. 11

    有没有办法将网格名称或参数传递给点击事件?

  12. 12

    有没有办法将函数作为宏的参数传递?

  13. 13

    有没有办法防止在我的命名参数构造函数中传递未定义?

  14. 14

    有没有办法将额外的参数传递给 List.ConvertAll 中的转换器

  15. 15

    有没有办法引用类型的构造函数?

  16. 16

    有没有办法让“make_unique<T[]>”可以将参数转发给T的构造函数?

  17. 17

    有没有办法传递带有泛型参数的函数指针?

  18. 18

    有没有办法将范围传递给指令templateUrl:函数?

  19. 19

    有没有办法将多个函数传递给AngularJS指令?

  20. 20

    有没有办法将函数从objective-c++传递给标准c++?

  21. 21

    有没有办法将哈希数组传递给 Chef 中的提供程序函数

  22. 22

    当没有__init__方法时,为什么此代码将参数传递给构造函数?

  23. 23

    有没有办法通过dplyr的`do`函数传递附加参数的向量?

  24. 24

    有没有办法确定模板类的模板参数类型?

  25. 25

    有没有办法根据模板参数的类型在不同的类实现之间进行选择?

  26. 26

    有没有一种“干净”的方法可以将大量(例如20多个)参数传递给类构造函数?

  27. 27

    Rust:有没有办法在宏类型参数上调用静态函数?

  28. 28

    Laravel。有没有办法将API资源作为参数传递?

  29. 29

    有没有办法将命名函数参数转换为 dict

热门标签

归档