假设我有一个内部课程" B"它是从抽象类派生的,例如
abstract class A
{
private int _abc;
public int abc
{
get{return _int;}
set{_abc=value;}
}
}
internal class B:A
{
}
我需要abc在不同的程序集中,我可以访问它吗?请帮我。
答案 0 :(得分:1)
如果由于某种原因需要在内部安全,您可以通过几种方式从外部代码访问
1)您可以使用InternalVisibleToAttribute授予对友好程序集访问内部的访问权限
[assembly:InternalVisibleTo("Test.dll")]
2)您可以使用Reflection来访问对象的成员
object obj = <instance of your internal type>;
var value = obj.GetType().GetProperty("abc").GetValue(obj);
3)您可以引入一个公共接口,该接口将提供访问abc属性的合同
public interface IAbcAccessor
{
int abc {get; set;}
}
internal abstract class A
: IAbcAccessor
{
private int _abc;
public int abc
{
get{return _int;}
set{_abc=value;}
}
int IAbcAccessor.abc
{
get{return abc;}
set{abc = value;}
}
}
外部代码可以通过使用接口
访问属性var accessor = (IAbcAccessor)<instance of your internal type>;
var value = accessor.abc;
答案 1 :(得分:0)
您无法在声明B的程序集之外创建B实例或声明任何类型为B的实例.E.g
B b = whatever
或
A b = new B()
不允许在组件之外声明B。
但是,如果你有一个公共方法
public class C
{
public static A MakeAB()
{
return new B();
}
}
在声明B的程序集中的,然后使用可以说
A a = C.MakeABe()
在任何程序集中,因为类型B不需要被C.MakeAB()的调用者知道