在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();
我正在寻找像静态接口这样的魔法(我知道这很愚蠢)或一些使用反射的通用魔法,我不知道。
请避免任何其他建议重写这些静态方法的答案。作者没有期望任何进一步的扩展,并编写了许多用户用来生成这些静态表的生成器。
基于对一个老问题的非常有创意的回答,您可以编写一个包装器来分配给您的魔术变量:
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