我有一个通用类:
public class Foo<T> where T: Interface
{
}
T被强制实现的接口内有2个静态方法。
在构造函数中,我希望能够基本上执行以下操作:
public Foo()
{
value1 = T.staticmethod1();
value2 = T.staticmethod2();
}
使用我在上面发布的伪代码无法完成此操作。不可能以这种方式调用这些静态方法吗?
我有一个通用类:
public class Foo<T> where T: Interface
{
}
T被强制实现的接口内有2个静态方法。
在构造函数中,我希望能够基本上执行以下操作:
public Foo()
{
value1 = T.staticmethod1();
value2 = T.staticmethod2();
}
使用我在上面发布的伪代码无法完成此操作。不可能以这种方式调用这些静态方法吗?
//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);
}
dynamic
也不行。虽然有通用约束(如接口),但仅适用于实例成员。你可以考虑将这些方法作为 Func<T>
/Action<T>
委托传递(参数)吗?new()
限制的泛型类型T
,是否有办法强制运行静态类构造函数(如果它还没有运行)?是否有任何方法可以强制一个类运行其父类的静态构造函数(如果它还没有运行),而无需硬编码父类的名称? - supercatC# 不允许调用接口中定义的静态方法。它会发出一个命名不当的错误信息:
如果你使用一个允许在接口中使用静态成员的语言编写的库,并尝试从 C# 访问静态成员,则也会出现 CS0017。
如果 C# 允许,你可以使用接口名称而不是泛型参数名称来调用它们:
// doesn't work:
public Foo() {
value1 = Interface.staticmethod1();
value2 = Interface.staticmethod2();
}
所以,你有几个选择:
由于特定类型中静态成员的存在并不能说明派生类型是否具有与该名称兼容的成员,因此无法使用受限泛型类型参数的静态成员。假设类型“Foo”具有返回Int32的静态函数Wowzo(),类型DerivedFoo1具有不同的返回Int32的静态函数Wowzo(),类型DerivedFoo2(从Foo派生)具有返回String的静态成员Wowzo(),而类型DerivedFoo3具有名为Wowzo的嵌套类。如果T是被限制为Foo后代的类型参数,那么T.Wowzo是什么?
你也可以将一个非静态方法作为包装器来调用你的静态方法。这个非静态方法可以成为你接口的一部分。