我正在开发的项目中有很多只有静态方法的实例类。
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();
我正在寻找像静态界面一样的魔法(我知道它是愚蠢的)或使用我不知道的反射的一些通用魔法。
请避免任何其他建议重写这些静态方法的答案。作者没有期待任何进一步的扩展,并编写了许多用户用来生成静态表的生成器。
非常感谢。
答案 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();