需要c#中类似全局方法的东西
本文关键字:方法 全局 需要 | 更新日期: 2023-09-27 18:09:47
我目前正在尝试为ServiceLocator构建一个流畅的接口。为了确保每个开发人员都可以轻松地设置1到n的映射
我想要这样的东西
ServiceLocator.Instance.For<IFoo>(Use<Foo>(), Use<FooBar>());
Singleton工作得很好…for方法的方法签名如下所示
public void For<TInterface>(params type[] services)
{
// ...
}
所以我在寻找类似于全局方法的东西
c#有一些全局方法,所有的方法都定义在System.Object上。但是当我在System上创建一个新的泛型ExtensionMethod。对象,则该方法将不可见。
public static class MyExtensions
{
public static void Use<T>(this Object instance)
{
// ..
}
}
MethodChaining是另一种选择,但是这种方法看起来很性感:D
有人知道吗?
实际上,当我为Object
创建扩展方法时,它是可见的。如,
public static class Extensions
{
public static void doStuff<T>(this T myObject)
{
}
}
class Program
{
static void Main(string[] args)
{
int a = 5;
a.doStuff();
string b = "aaa";
b.doStuff();
List<int> c = new List<int>() { 1, 2, 3, 10 };
c.doStuff();
Extensions.doStuff(c);
}
}
我理解错你的问题了吗? 您需要为包含您的扩展方法的名称空间添加一个using
语句,以便使其可见。在object
中添加扩展方法并不是一个好主意。
编辑:好了,现在我明白你的意思了。为了使用扩展方法,您需要实例。您要求对象上的静态扩展方法(Equals和ReferenceEquals是静态方法),这是不可能的。如果你在object上定义了一个扩展方法,它将在所有实例上可用,我敢肯定这不是你想要的。
public static class ObjectExtensions
{
public static string TypeFullName(this object obj)
{
return obj.GetType().FullName;
}
}
static void Main(string[] args)
{
var obj = new object();
Console.WriteLine(obj.TypeFullName());
var s = "test";
Console.WriteLine(s.TypeFullName());
}
服务定位器被广泛认为是一种反模式。此外,公共注册接口被广泛认为是一个无法解决的问题,除非您需要使用特定的容器。
回顾这两个有问题的决定,您可以通过定义接受多个类型参数的For
重载来消除对全局方法的需求:
ServiceLocator.Instance.For<IFoo, Foo, FooBar>();
For
方法看起来像这样:
public void For<TInterface, TImplementation>()
public void For<TInterface, TImplementation1, TImplementation2>()
...
您必须为每个类型计数定义重载,但它需要最少的语法和最多的可发现性。作为参考,. net框架的Action
和Func
类型支持9个类型参数。
写完之后,我想知道我是否误解了这个问题:为什么要为同一个接口指定多个实现?这不会导致解析IFoo
时产生歧义吗?