首先訪問一個類的私有成員不是什么好做法。大家都知道私有成員在外部是不能被訪問的。一個類中會存在很多私有成員:如私有字段、私有屬性、私有方法。對于私有成員造訪,可以套用下面這種非常好的方式去解決。
-
private
string
name;
-
public
string
Name
-
{
-
get
-
{
-
return
name;
-
}
-
set
-
{
-
name=value;
-
}
-
}
但是有時候,源代碼是別人的,只提供給你dll。或者你去維護別人的代碼,源代碼卻有丟失。這樣的情況或許你想知道私有成員的值,甚至去想直接調用類里面的私有方法。那怎么辦呢?在.net中訪問私有成員不是很難,這篇文章提供幾個簡單的方法讓你如愿以償。
為了讓代碼用起來優雅,使用擴展方法去實現。
1、得到私有字段的值:
-
public
static
TGetPrivateField<T>(
this
object
instance,
string
fieldname)
-
{
-
BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
-
Typetype=instance.GetType();
-
FieldInfofield=type.GetField(fieldname,flag);
-
return
(T)field.GetValue(instance);
-
}
2、得到私有屬性的值:
-
public
static
TGetPrivateProperty<T>(
this
object
instance,
string
propertyname)
-
{
-
BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
-
Typetype=instance.GetType();
-
PropertyInfofield=type.GetProperty(propertyname,flag);
-
return
(T)field.GetValue(instance,
null
);
-
}
3、設置私有成員的值:
-
public
static
void
SetPrivateField(
this
objectinstance,stringfieldname,objectvalue)
-
{
-
BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
-
Typetype=instance.GetType();
-
FieldInfofield=type.GetField(fieldname,flag);
-
field.SetValue(instance,value);
-
}
4、設置私有屬性的值:
-
public
static
void
SetPrivateProperty(
this
objectinstance,stringpropertyname,objectvalue)
-
{
-
BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
-
Typetype=instance.GetType();
-
PropertyInfofield=type.GetProperty(propertyname,flag);
-
field.SetValue(instance,value,
null
);
-
}
5、調用私有方法:
-
public
static
TCallPrivateMethod<T>(
this
object
instance,
string
name,
params
object
[]param)
-
{
-
BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
-
Typetype=instance.GetType();
-
MethodInfomethod=type.GetMethod(name,flag);
-
return
(T)method.Invoke(instance,param);
-
}
測試:
下面我們使用一個測試類,進行測試。新建一個類庫項目,測試的類代碼如下:
-
public
class
TestClass
-
{
-
-
public
TestClass()
-
{
-
privatefield1=1;
-
privatefield2=99;
-
PrivateFieldA=
"Lo"
;
-
PrivateFieldB=
"ve"
;
-
}
-
-
private
int
privatefield1;
-
private
int
privatefield2;
-
-
-
private
string
PrivateFieldA
-
{
-
get
;
-
set
;
-
}
-
private
string
PrivateFieldB
-
{
-
get
;
-
set
;
-
}
-
-
-
private
int
Add()
-
{
-
return
privatefield1+privatefield2;
-
}
-
private
string
Join()
-
{
-
return
PrivateFieldA+PrivateFieldB;
-
}
-
}
將上面類庫的dll引入控制臺項目中。使用下面代碼去使用這個類的私有成員:
-
TestClassobj=
new
TestClass();
-
System.Console.WriteLine(
"私有字段"
);
-
System.Console.WriteLine(obj.GetPrivateField<
int
>(
"privatefield1"
));
-
System.Console.WriteLine(obj.GetPrivateField<
int
>(
"privatefield2"
));
-
-
System.Console.WriteLine(
"私有屬性"
);
-
System.Console.WriteLine(obj.GetPrivateProperty<
string
>(
"PrivateFieldA"
));
-
System.Console.WriteLine(obj.GetPrivateProperty<
string
>(
"PrivateFieldB"
));
-
-
System.Console.WriteLine(
"私有方法"
);
-
System.Console.WriteLine(obj.CallPrivateMethod<
int
>(
"Add"
,
null
));
-
System.Console.WriteLine(obj.CallPrivateMethod<
string
>(
"Join"
,
null
));
-
-
System.Console.WriteLine(
"修改私有屬性"
);
-
obj.SetPrivateProperty(
"PrivateFieldA"
,
"hello"
);
-
obj.SetPrivateProperty(
"PrivateFieldB"
,
"world"
);
-
System.Console.WriteLine(obj.CallPrivateMethod<
string
>(
"Join"
,
null
));
-
System.Console.Read();
結果如下:
總結:實現對類私有成員的訪問。
原文標題: C#中訪問私有成員
鏈接: http://www.cnblogs.com/zhuqil/archive/2010/07/25/Access-Private-Member.html
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

