c# - 如何在充满常量的类中使用泛型?

标签 c# generics

我希望大家能清楚我的意思。我有多个充满选项的静态类:

static class Thing1
{
    public const string Name = "Thing 1";
    // More const fields here.
}

static class Thing2
{
    public const string Name = "Thing 2";
    // More const fields here.
}

现在我想使用这些选项来创建一个包含这些类之一的内容的类。

public void Create<T>()
{
    var foo = new Foo(T.Name);
    foo.Prop = T.Something;

    if (T.HasValue)
        foo.Add(T.Value);
}

但这当然行不通。我会使用接口(interface),但静态类无法实现接口(interface)。

有什么办法可以优雅地完成这项工作吗?使 Thing1Thing2 单例可以工作,但这不是一个很好的解决方案。

我可以创建一个结构并将对象放入另一个静态类中,但我想知道您是否可以执行类似上面的操作。

最佳答案

好吧,您可以创建一个接口(interface)并使您的类成为非静态并从此接口(interface)继承:

public class Thing1 : IThing
{
    public string Name { get; } = "Thing 1";
    // More const fields here.
}

public class Thing2 : IThing
{
    public string Name { get; } = "Thing 2";
    // More fields here.
}

interface IThing 
{   
    string Name { get; }
}

然后将它与类型参数约束一起用于您的方法:

public void Create<T>(T t) where T : IThing
{
    // Now compiler knows that `T` has all properties from `IThing`
    var foo = new Foo(t.Name);
    foo.Prop = t.Something;

    if (t.HasValue)
        foo.Add(t.Value);
}

关于c# - 如何在充满常量的类中使用泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59413569/

相关文章:

c++ - 通用继承和复制构造函数

c# - 一个用于连接具有相同接口(interface)的两个不同对象列表的衬垫

C++:当使用从对象的getter方法调用的值时,输出一个随机的负整数?

java - Java 通配符类型的下限和上限

c# - 什么时候在 C# 中解析泛型类型?

c# - C#中多态性中的复制构造函数

c# - 如何从 dotnet build 命令获取警告

c# - Gridsplitter 在 MouseOver 上可见

c# - 如何设置默认数据类型

c# - LINQ 通用连接和 Entity Framework