动态方法访问修饰符
Dynamic method access modifier
我想根据传入的类型限制对方法的访问。在我的特定情况下,如果您愿意,我正在开发 UDP "manager"。
我希望我的 UDPManager
用于不同的事情。例如,我可能有 1 个 UDPManager
用于客户端和服务器之间的通信,另一个 UDPManager
用于处理服务器与另一个服务器之间的通信。
我定义了一个 enum
来指定 UDPManager
的类型。例如,ManagerType.A = 1
和...
ManagerType.B = 2
UDPManager
有一些可以订阅的事件,如果这些事件不相关,我不希望它们可用,给定 UDPManager
的类型。
这是一个 class
的例子
public class Something
{
public int SomethingsType { get; set; }
public void A() { }
public void B() { }
}
我怎样才能做到,如果 SomethingsType == MessageType.A
,那么 MessageType.B
不可用(即它是私有的)?
为了更清楚,如果我输入:
Something something = new Something();
someting.SomethingsType = 1
我不想 something.B()
可用。
更新
抱歉提到 runtime
。我的意思是,如果说 SomethingsType
是 A
,我不希望说方法 (B
) 可用。
这是基于枚举的工厂构建方法的极端简单版本:
public enum ManagerType
{
A,B
}
public abstract class UDPManager
{
}
public class SomethingA : UDPManager
{
public void A()
{}
}
public class SomethingB : UDPManager
{
public void B()
{}
}
public class UdpManagerFactory
{
public UDPManager Build(ManagerType type)
{
if (type == ManagerType.A)
return new SomethingA();
if(type == ManagerType.B)
return new SomethingB();
throw new Exception("type not found");
}
}
救援接口:
public interface IUdpManagerA
{
void A();
}
public interface IUdpManagerB
{
void B();
}
public class UdpManager : IUdpManagerA, IUdpManagerB
{
public void A() { }
public void B() { }
}
public class UdpManagerFactory
{
private UdpManager Create() => new UdpManager();
public IUdpManagerA CreateOfA() => Create();
public IUdpManagerB CreateOfB() => Create();
}
UdpManagerFactory factory = new UdpManagerFactory();
IUdpManagerA a = factory.CreateOfA();
IUdpManagerB b = factory.CreateOfB();
界面是发布某些成员而其他成员可以保持隐藏的强大工具。
虽然您可能会说 是的,但您始终可以将 IUdpManagerA
转换为 IUdpManagerB
,反之亦然以访问隐藏成员,以及我的回答**这是不安全的,因为没有迹象表明 IUdpManagerA
也实现了 IUdpManagerB
,反之亦然。
哦,我忘了说你应该扔掉 ManagerType
枚举,因为有了接口你总是可以检查给定的实例是否是 A 或 B:
object instance = factory.CreateA();
if(instance is IUdpManagerA)
{
}
if(instance is IUdpManagerB)
{
}
或使用as
运算符:
object instance = factory.CreateA();
IUdpManagerA a = instance as IUdpManagerA;
IUdpManagerB b = instance as IUdpManagerB;
if(a != null)
{
}
else if(b != null)
{
}
我想根据传入的类型限制对方法的访问。在我的特定情况下,如果您愿意,我正在开发 UDP "manager"。
我希望我的 UDPManager
用于不同的事情。例如,我可能有 1 个 UDPManager
用于客户端和服务器之间的通信,另一个 UDPManager
用于处理服务器与另一个服务器之间的通信。
我定义了一个 enum
来指定 UDPManager
的类型。例如,ManagerType.A = 1
和...
ManagerType.B = 2
UDPManager
有一些可以订阅的事件,如果这些事件不相关,我不希望它们可用,给定 UDPManager
的类型。
这是一个 class
的例子public class Something
{
public int SomethingsType { get; set; }
public void A() { }
public void B() { }
}
我怎样才能做到,如果 SomethingsType == MessageType.A
,那么 MessageType.B
不可用(即它是私有的)?
为了更清楚,如果我输入:
Something something = new Something();
someting.SomethingsType = 1
我不想 something.B()
可用。
更新
抱歉提到 runtime
。我的意思是,如果说 SomethingsType
是 A
,我不希望说方法 (B
) 可用。
这是基于枚举的工厂构建方法的极端简单版本:
public enum ManagerType
{
A,B
}
public abstract class UDPManager
{
}
public class SomethingA : UDPManager
{
public void A()
{}
}
public class SomethingB : UDPManager
{
public void B()
{}
}
public class UdpManagerFactory
{
public UDPManager Build(ManagerType type)
{
if (type == ManagerType.A)
return new SomethingA();
if(type == ManagerType.B)
return new SomethingB();
throw new Exception("type not found");
}
}
救援接口:
public interface IUdpManagerA
{
void A();
}
public interface IUdpManagerB
{
void B();
}
public class UdpManager : IUdpManagerA, IUdpManagerB
{
public void A() { }
public void B() { }
}
public class UdpManagerFactory
{
private UdpManager Create() => new UdpManager();
public IUdpManagerA CreateOfA() => Create();
public IUdpManagerB CreateOfB() => Create();
}
UdpManagerFactory factory = new UdpManagerFactory();
IUdpManagerA a = factory.CreateOfA();
IUdpManagerB b = factory.CreateOfB();
界面是发布某些成员而其他成员可以保持隐藏的强大工具。
虽然您可能会说 是的,但您始终可以将 IUdpManagerA
转换为 IUdpManagerB
,反之亦然以访问隐藏成员,以及我的回答**这是不安全的,因为没有迹象表明 IUdpManagerA
也实现了 IUdpManagerB
,反之亦然。
哦,我忘了说你应该扔掉 ManagerType
枚举,因为有了接口你总是可以检查给定的实例是否是 A 或 B:
object instance = factory.CreateA();
if(instance is IUdpManagerA)
{
}
if(instance is IUdpManagerB)
{
}
或使用as
运算符:
object instance = factory.CreateA();
IUdpManagerA a = instance as IUdpManagerA;
IUdpManagerB b = instance as IUdpManagerB;
if(a != null)
{
}
else if(b != null)
{
}