我正在使用C#创建一个应用程序,并希望能够通过我的120个字符串轻松地执行foreach()循环。所有这些字符串的构造如下:
public class _currentweekapi
{
public string _1_artist { get; set; }
public string _2_artist { get; set; }
public string _3_artist { get; set; }
...
}
是否可以执行foreach()循环来遍历所有值。字符串是从JSON提要自动设置的,因此我无法将值直接输入列表。
我已经阅读了这个主题,并了解通过“反思”的方法,但我是C#的新手并且阅读它对我没有任何意义。
有人可以帮我解决这个问题,说明我该如何实现这个目标吗?
答案 0 :(得分:2)
使用反射非常简单 - 试一试
var properties = typeof(_currentweekapi).GetProperties();
foreach(PropertyInfo info in properties) {
if (info.Name.EndsWith("artist") {
// do something amazing
}
}
请参阅 - http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx了解更多信息
答案 1 :(得分:1)
您应该尝试做的第一件事是,不将字符串存储在显式命名的属性中,因为您的类定义似乎正在执行。最合适的情况似乎是List< string>类型属性,可以在类中保存它们。这也意味着你已经准备好了你的列表。
所以,如果你能够,改变类,或使用另一个接受JSON提要,并在类型的属性上使用.Add()列出< string>,而不是显式设置120个属性。
像这样:
public class ArtistData
{
public List<string> Artists{ get; set; }
public ArtistData()
{
this.Artists = new List<string>(0);
}
public void PopulateArtists(string jsonFeed)
{
// here something desrializes your JSON, allowing you to extract the artists...
// here you would be populating the Artists property by adding them to the list in a loop...
}
}
然后,您在属性Artists中有列表,可以直接使用列表,或者通过执行以下操作返回:
string[] artists = myInstance.Artists.ToArray();
但是,您似乎已经表明,您无法更改他们最终作为您向我们展示的课程中的个别属性提供给您的事实,因此...
假设你别无选择,只能从你所展示的课程开始,这里有一种方法可以循环完成所有这些值,就像你要求的那样,所需要的就是你通过课程将instance作为以下方法之一作为每个需要的一个参数:
// this will return a list of the values contained in the properties...
public List<string> GetListFromProperties<T>(T instance)
{
Type t = typeof(T);
PropertyInfo[] props = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
// As a simple list...
List<string> artists = new List<string>(props.Length);
for (int i = 0; i < props.Length; i++)
{
if(!props[i].Name.Contains("_artist")){ continue; }
artists.Add(props[i].GetValue(instance, null).ToString());
}
return artists;
}
// this will return a dictionary which has each artist stored
// under a key which is the name of the property the artist was in.
public Dictionary<string,string> GetDictionaryFromProperties<T>(T instance)
{
Type t = typeof(T);
PropertyInfo[] props = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
// As a dictionary...
Dictionary<string,string> artists = new Dictionary<string,string>(props.Length);
for (int i = 0; i < props.Length; i++)
{
if(artists.ContainsKey(props[i].Name) || !props[i].Name.Contains("_artist")){ continue; }
artists.Add(props[i].Name, props[i].GetValue(instance, null).ToString());
}
return artists;
}
任何一方都应该提供帮助,但不要使用字典,因为它需要更多的开销,除非你真的需要知道每个艺术家来自的属性的名称,在这种情况下它比简单更有帮助列表。
顺便说一下,由于方法是通用的,即它们接受类型为T的参数,所以相同的方法适用于任何类实例,而不仅仅是你现在正在努力的那个。
记住:虽然目前看起来非常方便,但这不一定是解决这个问题的最佳方法。比这更好,这将是我为完全重新上课而提出的最初建议,所以不需要这样的事情。
答案 2 :(得分:0)
您可以这样做:
List<string> list = new List<string>();
foreach (var property in _currentweekapi.GetType().GetProperties())
{
list.Add(property.GetValue(_currentweekapi, null));
}
答案 3 :(得分:0)
如果您可以确保没有其他类型的属性,那么这将起作用:
var list =
typeof(_currentweekapi)
.GetProperties()
.Select(pi => (string)pi.GetValue(x, null))
.ToList();