【问题标题】:Define a variable of type 'Type' which only accepts types which are subclasses of a specific type [duplicate]定义一个“类型”类型的变量,它只接受作为特定类型的子类的类型[重复]
【发布时间】:2020-01-09 04:55:36
【问题描述】:

我正在使用 C#,我的代码中有以下方法:

public void Test(System.Type type) {...}

但我希望变量“type”代表一个类型,该类型必须是类MyClass 的子类。为了清楚起见,我不希望“类型”本身成为MyClass 的子类,因为它应该代表一种类型。例如,不应允许调用 Test(typeof(int)),因为 'int' 不是 MyClass 的子类。

在 C# 中可以吗?

更新: 我花了很长时间试图在网上找到解决方案后问了这个问题,但事实证明之前已经在这里问过这个问题:C#: Restricting Types in method parameters (not generic parameters) 我错过了。太糟糕了,即使该线程中的答案似乎也无法正确解决问题。

更新 2: 事实证明(请参阅此问题的解决方案),可以使用泛型而不是将参数传递给方法,而且它似乎工作得很好。

【问题讨论】:

  • 使用泛型参数?
  • 还有...MyClass 在哪里?我在您的代码中没有看到它。
  • 可以使用泛型,但问题已明确。
  • Test<T>() where T: MyClass
  • @yyy 所有类型都是 not 类型的子类。所有类型都是Object的子类。

标签: c#


【解决方案1】:

为此,您可以使用带有约束的泛型:

public void Test<T>() where T : MyClass
{
    var type = typeof(T);
    // ...
}

【讨论】:

  • 那么如何将参数传递给方法Test()?
  • @yyy,这不是必需的,Test 从泛型类型参数创建 type 变量本身。你可以这样称呼它:Test&lt;MyDerivedClass&gt;();。由于类型约束where T : MyClass,不可能用Test&lt;int&gt;(); 调用它。但是,如果您在编译时知道类型名称,则只能使用此方法。
  • 哦,现在我明白了。感谢 Xiaoy312 和 Olivier Jacot-Descombes!
猜你喜欢
  • 2022-10-04
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多