在c#中有类似静态的东西

时间:2015-08-28 17:10:06

标签: c# static

我正在开发的项目中有很多只有静态方法的实例类。

public class TableA {    
    static void StaticCall() {}
}

我已经实现了一个ITable接口,其方法为Call()

public interface ITable {    
    void Call() {}
}

调用静态方法StaticCall()

public class TableA : ITable {    
    static void StaticCall() {}
    void Call() { TableA.StaticCall();}
}

无论如何,我不必写

TableA.StaticCall(); 

相反,我写

staticMagicNonExistingThisMaybeCallType.StaticCall();

我正在寻找像静态界面一样的魔法(我知道它是愚蠢的)或使用我不知道的反射的一些通用魔法。

请避免任何其他建议重写这些静态方法的答案。作者没有期待任何进一步的扩展,并编写了许多用户用来生成静态表的生成器。

非常感谢。

1 个答案:

答案 0 :(得分:4)

基于对旧问题的非常有创意的答案,您可以编写一个包装器来分配您的魔术变量:

public class StaticWrapper : DynamicObject {
  Type _type;
  public StaticWrapper(Type type) {
    _type = type;
  }
  public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) {
    var method = _type.GetMethod(binder.Name, BindingFlags.Static | BindingFlags.Public, null, args.Select(a => a.GetType()).ToArray(), null);
    if (method == null) return base.TryInvokeMember(binder, args, out result);
    result = method.Invoke(null, args);
    return true;
  }
  // also do properties ...
}

在您的上下文中使用:

var magicType = new StaticWrapper(typeof(TableA));
magicType.StaticCall();

包装器的来源:https://stackoverflow.com/a/5205041/4154421