欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
C#中屬性PropertyInfo的使用(轉)
昨天編程遇到一個(gè)問(wèn)題兩個(gè)類(lèi)字段都是二十多個(gè),其中有十多個(gè)是相同的,需要將一個(gè)類(lèi)的字段賦值給另外一個(gè)類(lèi),開(kāi)始的自己想手動(dòng)的一個(gè)個(gè)去賦值,后來(lái)想來(lái)一下C#基礎知識,用PropertyInfo就可以解決類(lèi)似的問(wèn)題,博客園寫(xiě)博客需要內容詳實(shí),我還是慢慢的C#屬性從頭寫(xiě)起,先看下屬性的定義吧:
屬性定義:它提供靈活的機制來(lái)讀取、編寫(xiě)或計算某個(gè)私有字段的值。 可以像使用公共數據成員一樣使用屬性,但實(shí)際上它們是稱(chēng)作“訪(fǎng)問(wèn)器”的特殊方法。 這使得可以輕松訪(fǎng)問(wèn)數據,此外還有助于提高方法的安全性和靈活性。屬性通??梢苑譃槌R帉傩院妥詣?dòng)屬性。兩者之間還是有一點(diǎn)區別的,最開(kāi)始編程對著(zhù)兩個(gè)全無(wú)概念。
常規屬性
常規屬性以前做Winform的時(shí)候經(jīng)常使用,現在開(kāi)始使用EF,基本上都是使用自動(dòng)屬性,看下常規屬性的完成構成:
1.私有字段,一般設置為私有,通過(guò)屬性來(lái)賦值保證起安全性:
1
private string _age;
2.get訪(fǎng)問(wèn)器,負責讀取數據,其中可以進(jìn)行自己的邏輯判斷和數據驗證,以return或者throw結束:
1
2
3
4
5
get
{
//年齡返回值判斷
return _age> 0 ? _age: 0;
}
3.set訪(fǎng)問(wèn)器,負責給屬性賦值,類(lèi)似于一個(gè)返回類(lèi)型為void的方法,可以包含邏輯處理,例如可以根據默認的值通過(guò)計算后返回結果。
自動(dòng)屬性
上面簡(jiǎn)單的說(shuō)了一下常規屬性,當屬性訪(fǎng)問(wèn)器中不需要其他邏輯時(shí),可以使用自動(dòng)屬性,不過(guò)需要注意一點(diǎn)的就是聲明自動(dòng)屬性時(shí),編譯器將創(chuàng )建一個(gè)私有的匿名后備字段,該字段只能通過(guò)屬性的 get 和 set 訪(fǎng)問(wèn)器進(jìn)行訪(fǎng)問(wèn)。
1
public int Id { get; set; }
自動(dòng)屬性沒(méi)有太多可以可以說(shuō)的東西,簡(jiǎn)單的對比一下常規屬性和自動(dòng)屬性之間的區別吧:
1.自動(dòng)實(shí)現的屬性必須同時(shí)聲明 get 和 set 訪(fǎng)問(wèn)器。創(chuàng )建 readonly 自動(dòng)實(shí)現屬性時(shí),需要將set 訪(fǎng)問(wèn)器設置為private 。
2自動(dòng)實(shí)現的屬性上可以使用特性,不能用在支持后備字段上。 如果屬性的后備字段上使用特性,則應該只創(chuàng )建常規屬性。
3.自動(dòng)實(shí)現屬性get,和set中不能包含特殊的邏輯處理。與字段類(lèi)似,但不同于字段。與字段不同,屬性不作為變量來(lái)分類(lèi),不能將屬性作為 ref參數或 out參數傳遞。
屬性PropertyInfo的使用
上面大概簡(jiǎn)單的說(shuō)了一下屬性和自動(dòng)屬性之間的區別,現在可以回歸到文中最開(kāi)始的時(shí)候的那個(gè)問(wèn)題:
1.案例1,如果兩個(gè)類(lèi)中有大部分的字段相同,需要將其中一個(gè)類(lèi)的字段賦值給另外一個(gè)類(lèi):
定義Person類(lèi):
1
2
3
4
5
6
7
8
9
10
11
public class Person {
public Person(int id,string name,string address)
{
this.Id = id;
this.Name = name;
this.Address = address;
}
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
}
定義User類(lèi)
1
2
3
4
5
public class User {
public int Id { get; set; }
public string Name { get; set; }
public string Group { get; set; }
}
轉換方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static User ConvertObject(User user,Person person)
{
PropertyInfo[] userPro = user.GetType().GetProperties();
PropertyInfo[] personPro = person.GetType().GetProperties();
if (userPro.Length>0&&personPro.Length>0)
{
for (int i = 0; i < userPro.Length; i++)
{
for (int j = 0; j < personPro.Length; j++)
{<br>              //判斷User的屬性是不是的Person中
if (userPro[i].Name == personPro[j].Name && userPro[i].PropertyType == personPro[j].PropertyType)
{
Object value=personPro[j].GetValue(person, null);
//將Person中屬性的值賦值給User<br>                  userPro[i].SetValue(user,value , null);
}
}
}
}
return user;
}
方法的調用:
1
2
3
4
5
6
7
8
9
10
static void Main(string[] args)
{
Person person = new Person(1,"FlyElephant","北京");
User user = new User();
user.Id = 20;
user = ConvertObject(user, person);
Console.WriteLine("Id:" + user.Id + "Name:" + user.Name + "角色:" + user.Group);
System.Console.Read();
}
2.之前在做Winform的時(shí)候就經(jīng)?;厥褂玫絊qlHelper,現在也有很多公司是這么使用的,當時(shí)很多東西感覺(jué)就是重復性的操作,一度以為編程只是復制粘貼,下面這段代碼大家應該很常見(jiàn):
1
2
3
4
5
6
7
8
9
10
List<Person> list = new List<Person>();
SqlDataReader sdr = new SqlDataReader();
while (sdr.Read())
{
Person person = new Person();
person.Name = sdr.GetString(0);
//....下面類(lèi)似
list.Add(person);
}
開(kāi)始寫(xiě)的時(shí)候覺(jué)得是鍛煉了,寫(xiě)的多了就覺(jué)得無(wú)聊了,其實(shí)完全可以換一種方式來(lái)實(shí)現上面的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static List<T> ConvertData<T>(SqlDataReader sdr)
{
List<T> list = new List<T>();
Type type = typeof(T);
PropertyInfo[] properties = type.GetProperties();
while (sdr.Read())
{
T model = Activator.CreateInstance<T>();
for (int i = 0; i < properties.Length; i++)
{
for (int j = 0; j < sdr.FieldCount; j++)
{
//判斷屬性的名稱(chēng)和字段的名稱(chēng)是否相同
if (properties[i].Name == sdr.GetName(j))
{
Object value =sdr[j];
//將字段的值賦值給User中的屬性
properties[i].SetValue(model, value, null);
}
}
}
list.Add(model);
}
return list;
}
1
2
3
List<User> list = new List<User>();
SqlDataReader sdr = cmd.ExecuteReader();
list = ConvertData<User>(sdr);
3.案例三,ajax頁(yè)面傳遞值可以使用get方式,或者post方式的傳遞JSON格式數據轉換
簡(jiǎn)單的轉換一個(gè)get傳遞的字符串Name=xx&Age=xx,后臺直接用一個(gè)字典去模擬了:
1
2
3
4
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("Id",100);
dic.Add("Name", "keso");
dic.Add("Group", "程序員");
轉換字典方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static T ConvertDic<T>(Dictionary<string, object> dic)
{
T model = Activator.CreateInstance<T>();
PropertyInfo[] modelPro = model.GetType().GetProperties();
if (modelPro.Length > 0 && dic.Count() > 0)
{
for (int i = 0; i < modelPro.Length; i++)
{
if (dic.ContainsKey(modelPro[i].Name))
{
modelPro[i].SetValue(model, dic[modelPro[i].Name], null);
}
}
}
return model;
}
最后的調用:
1
User user = ConvertDic<User>(dic);
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
實(shí)現自己的ORM(反射以及Attribute在ORM中的應用)
Type 關(guān)鍵字解讀
C#反射詳解
屬性(Properties)和字段在C#中的關(guān)系
C#遍歷對象屬性
ASP.NET反射
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久