我不确定我的问题措辞是否正确,但我有一个类需要为实例化它的任何类提供属性,但不要公开该属性。举个例子:
public class MyClass1
{
private double _PrivateNum = 9499488.07;
private double PrivateNum
{
get
{
return _PrivateNum;
}
}
}
我想在MyClass2中创建一个MyClass1实例,并且能够从MyClass2访问PrivateNum
,但我不希望{My}在MyClass2之外可用。{1}}。我知道PrivateNum
当然不正确。
private double PrivateNum
我刚刚举起这个例子来说明我想要完成的事情。我记得,VB使用public class MyClass2
{
public MyClass1 myclass1 = new MyClass1();
public double GetSomeData
{
double PrivateNum = myclass1.PrivateNum; <<== How do I set this in MyClass1
} so I can access it in MyClass2,
} but be unavailable outside
of MyClass2?
来实现这一目标。它是如何在C#中完成的?
答案 0 :(得分:1)
C#不像C ++那样具有friend
s的概念。类似的想法是internal
。如果将属性标记为internal
,则只有包中的类可以使用它。当然,这需要您的设计允许将MyClass1
和MyClass2
放在同一个包中。
答案 1 :(得分:0)
C#中没有friend
个类。但是,如果您只想将数据公开给创建MyClass1
实例的类,那么您可以使用从MyClass1
构造函数返回的回调的丑陋代码:
public class MyClass1
{
private double _privateNum = 9499488.07;
public MyClass1(out Func<double> callback)
{
callback = () => _privateNum;
}
// ...
}
现在只有实例化MyClass1
实例的类才能访问此回调:
public class MyClass2
{
private Func<double> callback;
public MyClass1 myclass1;
public MyClass2()
{
myclass1 = new MyClass1(out callback);
}
public double GetSomeData()
{
double privateNum = callback();
// ...
}
}
当然,你总是可以使用反射并将数据保密到所有类:
Type type = myclass1.GetType();
var flags = BindingFlags.Instance | BindingFlags.NonPublic;
var field = type.GetField("_privateNum", flags);
double privateNum = (double)field.GetValue(myclass1);
答案 2 :(得分:0)
您是否只能在protected
中创建变量MyClass1
,然后只使用MyClass1
将MyClass2
作为子类?
答案 3 :(得分:0)
正如我从您的评论中看到的那样,您不希望将某些数据传输到客户端。它非常容易 - 只需将MyClass2
个对象映射到其他没有要隐藏数据的类MyClass3
。您可以使用AutoMapper。