在C#中,如何使用特定类型的数组(或任何扩展它的数组)?

问题描述 投票:-2回答:1

我想做这样的事情:

public class MyAttribute : Attribute
{
    public Type<BaseAllowedType>[] handledTypes { get; set; }

    //...elided...
}

那将只允许有人添加属性与他们处理的类型,如果这些类型继承自BaseAllowedType

例:

[MyAttribute(handledTypes = SubType)]
public class MyClass
{
}

public class SubType : BaseAllowedType
{
}

这样的事情可能在C#中出现吗? (它是在Java中,但不确定C#是否允许它)

在Java中它将是public Class<? extends BaseAllowedType>[] handledTypes

c# .net
1个回答
4
投票

首先,这是一个属性,而不是一个领域。

其次,属性不能在C#中泛化,也不能在属性中泛化。 (就此而言,字段都不能。只有类,结构,接口,委托和方法才能被泛化。)

也就是说,我们可以抓住你的问题。

有两种方法可以对泛型类型参数设置约束。第一种是对泛型类或方法的声明设置约束:

class Foo<T> where T : Animal {}

现在Foo<Giraffe>Foo<Animal>Foo<Turtle>是合法的,但Foo<string>不是。

其次,在接口和委托上,您可以放置​​协方差注释:

interface IFoo<out T> 
{
  T SomeProperty { get; }
}

T必须仅用于输出位置。使用此约束,您可以将IFoo<Giraffe>分配给IFoo<Animal>类型的变量,但反之亦然。

在这两个特性之间,通常可以在C#中构建合理的类型约束。

© www.soinside.com 2019 - 2024. All rights reserved.