在c#中是静态的

本文关键字:静态 | 更新日期: 2023-09-27 18:10:12

我正在做一个项目,这个项目有很多只有静态方法的实例类。

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

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

public interface ITable {    
    void Call() {}
}

调用静态方法StaticCall()

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

我是不是可以不写

TableA.StaticCall(); 

改成

staticMagicNonExistingThisMaybeCallType.StaticCall();

我正在寻找像静态接口这样的魔法(我知道这很愚蠢)或一些使用反射的通用魔法,我不知道。

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

在c#中是静态的

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

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