gpt4 book ai didi

c# - 使用受约束泛型类型 C# 的静态方法

转载 作者:太空狗 更新时间:2023-10-29 20:00:24 24 4
gpt4 key购买 nike

我有一个泛型类:

public class Foo<T> where T: Interface
{

}

T 被迫实现的接口(interface)中定义了 2 个静态方法。

在构造函数中,我希望能够基本上执行以下操作:

public Foo()
{
value1 = T.staticmethod1();
value2 = T.staticmethod2();
}

这无法使用我在上面发布的伪代码来完成。这样调用这些静态方法是不是不行?

最佳答案

您可以使用扩展方法。这项技术被命名为 pseudo-mixins .尽管扩展方法实际上是静态的,但它们“假装”为实例方法,因此您仍然需要 T 的具体实例。

此外,如果您希望您的接口(interface)保留其作为 self 记录“契约”的角色,指定您的 T 类应该具有哪些方法,那么这也是一种作弊。但是它们是类型安全的(如果您不将 IBarExtensions 引入范围内,您的 Foo 类将无法编译)

//our interface
public interface IBar {}

// the two static methods are define as extension methods
public static class IBarExtensions {
public static string someMethod1(this IBar self) {
return "my initialization 1";
}
public static string someMethod2(this IBar self) {
return "my initialization 2";
}
}

public class Foo<T> where T : IBar, new()
{
public string value1 {get; private set;}
public string value2 {get; private set;}

public Foo() {
T t = new T(); // we can do this because of the "new()" constraint
// in the class definition
// Alternatively we could pass an instance of T in
// the constructor
// public Foo(T t)
value1 = t.someMethod1();
value2 = t.someMethod2();
}
}

测试

public class TestBar : IBar {}
void Main()
{
var c = new TestBar();

var t = new Foo<TestBar>();
Console.WriteLine(t.value1);
}

关于c# - 使用受约束泛型类型 C# 的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6986576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com