C# 有没有一种方法可以访问类的成员,在访问时使用字符串而不是类名
我希望使用一些反射来访问类中的所有成员并获取它们的值。这是全班的。我总是初始化Championsids类。我知道有很多代码,但很简单C# 有没有一种方法可以访问类的成员,在访问时使用字符串而不是类名,c#,class,reflection,C#,Class,Reflection,我希望使用一些反射来访问类中的所有成员并获取它们的值。这是全班的。我总是初始化Championsids类。我知道有很多代码,但很简单 public class ChampionIds { public string type; public string format; public string version; public Data data; }
public class ChampionIds
{
public string type;
public string format;
public string version;
public Data data;
}
public class Data
{
public Champions Aatrox;
public Champions Ahri;
public Champions Akali;
public Champions Alistar;
public Champions Amumu;
public Champions Anivia;
public Champions Annie;
public Champions Ashe;
public Champions AurelionSol;
public Champions Azir;
public Champions Bard;
public Champions Blitzcrank;
public Champions Brand;
public Champions Braum;
public Champions Caitlyn;
public Champions Camille;
public Champions Cassiopeia;
public Champions Chogath;
public Champions Corki;
public Champions Darius;
public Champions Diana;
public Champions Draven;
public Champions DrMundo;
public Champions Ekko;
public Champions Elise;
public Champions Evelynn;
public Champions Ezreal;
public Champions FiddleSticks;
public Champions Fiora;
public Champions Fizz;
public Champions Galio;
public Champions Gangplank;
public Champions Garen;
public Champions Gnar;
public Champions Gragas;
public Champions Graves;
public Champions Hecarim;
public Champions Heimerdinger;
public Champions Illaoi;
public Champions Irelia;
public Champions Ivern;
public Champions Janna;
public Champions JarvanIV;
public Champions Jax;
public Champions Jayce;
public Champions Jhin;
public Champions Jinx;
public Champions Kalista;
public Champions Karma;
public Champions Karthus;
public Champions Kassadin;
public Champions Katarina;
public Champions Kayle;
public Champions Kennen;
public Champions Khazix;
public Champions Kindred;
public Champions Kled;
public Champions KogMaw;
public Champions Leblanc;
public Champions LeeSin;
public Champions Leona;
public Champions Lissandra;
public Champions Lucian;
public Champions Lulu;
public Champions Lux;
public Champions Malphite;
public Champions Malzahar;
public Champions Maokai;
public Champions MasterYi;
public Champions MissFortune;
public Champions MonkeyKing;
public Champions Mordekaiser;
public Champions Morgana;
public Champions Nami;
public Champions Nasus;
public Champions Nautilus;
public Champions Nidalee;
public Champions Nocturne;
public Champions Nunu;
public Champions Olaf;
public Champions Orianna;
public Champions Pantheon;
public Champions Poppy;
public Champions Quinn;
public Champions Rammus;
public Champions RekSai;
public Champions Renekton;
public Champions Rengar;
public Champions Riven;
public Champions Rumble;
public Champions Ryze;
public Champions Sejuani;
public Champions Shaco;
public Champions Shen;
public Champions Shyvana;
public Champions Singed;
public Champions Sion;
public Champions Sivir;
public Champions Skarner;
public Champions Sona;
public Champions Soraka;
public Champions Swain;
public Champions Syndra;
public Champions TahmKench;
public Champions Taliyah;
public Champions Talon;
public Champions Taric;
public Champions Teemo;
public Champions Thresh;
public Champions Tristana;
public Champions Trundle;
public Champions Tryndamere;
public Champions TwistedFate;
public Champions Twitch;
public Champions Udyr;
public Champions Urgot;
public Champions Varus;
public Champions Vayne;
public Champions Veigar;
public Champions Velkoz;
public Champions Vi;
public Champions Viktor;
public Champions Vladimir;
public Champions Volibear;
public Champions Warwick;
public Champions Xerath;
public Champions XinZhao;
public Champions Yasuo;
public Champions Yorick;
public Champions Zac;
public Champions Zed;
public Champions Ziggs;
public Champions Zilean;
public Champions Zyra;
}
public class Champions
{
public string version;
public string id;
public string key;
public string name;
public string title;
public string blurb;
public Dictionary<string, int> info;
public Dictionary<string, string> image;
public List<string> tags;
public string partype;
public Dictionary<string, double> stats;
}
但问题是我想把所有不同的冠军钥匙和名字都放到字典里。像这样
Dictionary<string, string> ChampIdDict = new Dictionary<string, string>();
ChampIdDict.Add(championIds.data.Aatrox.key, championIds.data.Aatrox.name);
结果就是这样
Aatrox
Ahri
Akali
Alistar
Amumu
Anivia
//and so on
我怎样才能做到这一点
FieldInfo[] fields = typeof(Data).GetFields();
foreach (var field in fields)
{
Console.WriteLine("Inserting champion = " + field.Name + " into the dictionary");
string key = championIds.data.(field.Name).key;
string name = championIds.data.(field.Name).name;
ChampIdDict.Add(key, name)
}
结果是,我从一个网站上简单地获得冠军id,然后我说
字符串returnedChampionId=//来自网站ex.266
字符串championName=ChampIdDict[266]
谢谢你的阅读。希望您能推荐一些内容您需要从每个字段中获取值并将其转换为适当的类型。然后可以访问内部属性
Data actualDataObject = // whereever you get it from
Dictionary<string, string> ChampIdDict = new Dictionary<string, string>();
FieldInfo[] fields = typeof(Data).GetFields();
foreach (var field in fields)
{
Champions temp = (Champions)field.GetValue(actualDataObject);
string key = temp.key;
string name = temp.name;
ChampIdDict.Add(key, name)
}
在linq中,这可能看起来像这样:
Dictionary<string, string> ChampIdDict = (from field in fields
let temp = (Champions)field.GetValue(actualDataObject)
select new {key = temp.key, name = temp.name})
.ToDictionary(x => x.key, x => x.name);
您需要从每个字段中获取值,并将其转换为适当的类型。然后可以访问内部属性
Data actualDataObject = // whereever you get it from
Dictionary<string, string> ChampIdDict = new Dictionary<string, string>();
FieldInfo[] fields = typeof(Data).GetFields();
foreach (var field in fields)
{
Champions temp = (Champions)field.GetValue(actualDataObject);
string key = temp.key;
string name = temp.name;
ChampIdDict.Add(key, name)
}
在linq中,这可能看起来像这样:
Dictionary<string, string> ChampIdDict = (from field in fields
let temp = (Champions)field.GetValue(actualDataObject)
select new {key = temp.key, name = temp.name})
.ToDictionary(x => x.key, x => x.name);
相反,类数据使用字典…我不太确定这和我的问题有什么关系。编辑:顺便说一句,我不能这样做已经测试过了。我从JSON反序列化中获得输入,因此基本上that@Bjørndrachman你需要用字典来做这件事。如果你这么说的话,我可以用字典试试。但是我从Newtonsoft库的一些JSON中得到了它,所以我不知道这是否有效。但谢谢你的评论,而不是课堂数据使用字典…我不太确定这和我的问题有什么关系。编辑:顺便说一句,我不能这样做已经测试过了。我从JSON反序列化中获得输入,因此基本上that@Bjørndrachman你需要用字典来做这件事。如果你这么说的话,我可以用字典试试。但是我从Newtonsoft库的一些JSON中得到了它,所以我不知道这是否有效。但是谢谢你的评论,这段代码很有效。非常感谢。我没有使用GetValueactualDataObject,而是使用GetValuechampionIds.data。这段代码有效。非常感谢。我使用的不是GetValueactualDataObject,而是GetValuechampionIds.data
Data actualDataObject = // whereever you get it from
Dictionary<string, string> ChampIdDict = new Dictionary<string, string>();
FieldInfo[] fields = typeof(Data).GetFields();
foreach (var field in fields)
{
Champions temp = (Champions)field.GetValue(actualDataObject);
string key = temp.key;
string name = temp.name;
ChampIdDict.Add(key, name)
}
Dictionary<string, string> ChampIdDict = (from field in fields
let temp = (Champions)field.GetValue(actualDataObject)
select new {key = temp.key, name = temp.name})
.ToDictionary(x => x.key, x => x.name);