在我的解决方案中,我有一个DLL项目,比如Project1
,它拥有一个类,比如class A
。这个类有一些属性,所以必须只在这个DLL中设置。引用此DLL的任何其他项目只能使用getter。到目前为止,我已经通过内部访问setter处理了这种情况,例如:
public class A
{
int Num1
{
get;
internal set;
}
int Num2
{
get;
internal set;
}
}
现在我必须向解决方案中添加另一个项目Project2
,不仅必须使用class A
(getter和setter),而且Project1
还有一个引用新项目。所以我决定在hierarcy的顶部用不同的定义dll分隔class A
。这就是重点,我的问题是araises。现在,Project1
和Project2
都无法看到所有设置者。如果我删除internal
访问器,则setter将可用于引用定义dll的任何程序集。我不希望这样,因为class A
上的信息非常重要,所以不能错误地设置。
如何限制class A
和Project1
之外Project2
的设置者的访问权限?
我想到的只有解决方案是使用InternalsVisibleTo
。我不知道,听起来并不完美。同时合并Project1
和Project2
将是另一种解决方案,但这两种解决方案对完全不同的任务负责,它不是设计方面的最佳选择。
答案 0 :(得分:2)
您可以在其上保留内部保护程序,但为另一个程序集提供信任以访问内部成员。
[assembly: InternalsVisibleTo("AssemblyName")]
您可以在类级别执行此操作,也可以根据需要在整个程序集本身执行此操作。
答案 1 :(得分:0)
你总是可以做这样的事情(设计的噩梦,但做你要求的):
public class A
{
int _Num1, _Num2;
int Num1 {get {return _Num1;}; }
int Num2 {get {return _Nun2;}; }
protected void SetNum (int pWhich, int pV)
{
if ( pWhich == 1 ) {_Num1 = pV; return;}
_Num2 = pV;
}
}
然后你可以正常实例化...当你需要设置你使用反射的值时:
myClassA.GetType().GetMethod ("SetNum", BindingFlags.NonPublic ).Invoke (myClassA, new object[] {1, 777 });
答案 2 :(得分:0)
如果我正确地认为Project1做了一些特定的事情,并且Project2是一个抽象,那么这是控制反转的候选者 - 理想情况下,实现应取决于抽象,而不是相反。
如果Project2中的内容需要控制Project1中定义的内容,请在Project2中创建一个接口并让Project2与该接口通信,然后在Project1中实现该接口并在内部完成所有脏工作。