需要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

有人知道吗?

需要c#中类似全局方法的东西

实际上,当我为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框架的ActionFunc类型支持9个类型参数。

写完之后,我想知道我是否误解了这个问题:为什么要为同一个接口指定多个实现?这不会导致解析IFoo时产生歧义吗?