【问题标题】:How to pass types from a generic method in C# [duplicate]如何从 C# 中的泛型方法传递类型 [重复]
【发布时间】:2021-10-21 09:50:48
【问题描述】:

我有一个泛型方法,它采用类型 T 的 sapclient 方法,但是当我想初始化它时,它初始化为对象而不是实际的类。如何初始化它并根据需要传递用户名和密码?

public static Auth<T>(string username, string password) where T : new()
{
    T client = new T(binding, endpointAddress)
    client.ClientCredentials.UserName.UserName = username
    client.ClientCredentials.UserName.Password = password
}

我尝试了该代码,但它总是给出错误提示

无法创建变量类型“T”的实例

【问题讨论】:

  • 没有反射没有简单的方法来实现这一点。您可以使用带有Create 方法的接口或将Func&lt;T, string, string&gt; 传递给该方法以在外部创建T 吗?当然,还有其他方法,具体取决于您的限制
  • 泛型类型参数的目的是什么? T 的可能值是多少?我可以打电话给Auth&lt;string&gt;(uid,pwd)吗?
  • 目前无法在 C# 中完成。构造函数的无参数形式是当前new constraint 支持的唯一形式。有多种变通方法,但要帮助您找出最合适的变通方法,需要对您的应用程序有更多了解。该解决方案可能涉及重构您的代码以使用工厂等。
  • 您的方法缺少返回类型

标签: c# .net .net-core


【解决方案1】:

您不能保证T 类型的构造函数具有两个参数,无论bindingendpointAddress 是什么类型。您的 new() 约束确保 T 将有一个带有 no 参数的构造函数,但没有说明任何其他构造函数或缺少任何构造函数。

例如,调用您的方法是有效的,因为它是这样定义的:Auth&lt;int&gt;("username", "password"),因为int 是一个值类型(并且所有值类型本身都有一个无参数构造函数,它将所有字段初始化为它们的默认值)。但是int 没有带有两个参数的构造函数。这种矛盾就是你的代码无法编译的原因。

我认为一般来说不可能在泛型类型上调用非空构造函数。构造函数不是继承的,除了new() 约束之外,没有其他方法可以约束构造函数。您确定要使用泛型吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多