列出自定义类成员和类型
本文关键字:类型 成员 自定义 | 更新日期: 2023-09-27 18:27:43
这似乎是有史以来最基本的事情,但不知怎么的,我找不到答案,也弄不明白。
假设我有一个自定义类:
public class WineCellar
{
public string year;
public string wine;
public double nrbottles;
}
现在我想要一个函数:
WineCellar ex = new WineCellar();
ex.members();
这应该会回来:年份,葡萄酒,nrbootles。
和:
ex.members().types();
应返回:字符串,字符串,双
我想同样的道理,假设你有一个例子{2010,Rioja,6}。是否存在通过索引返回这些内容的语法?即
ex[1]
或
ex.{1}
回到2010年?
很抱歉出现基本问题。
正如Michelle在评论中所说,这听起来是解决更大问题的错误方法。
然而,如果你确实需要这种东西,你可以使用反射:
//returns a list of propertyInfo objects for the class
// with all kinds of usefull information
public List<PropertyInfo> GetMemberInfos()
{
return this.GetType().GetProperties().ToList();
}
//returns a list of property names
public List<string> GetMemberNames
{
return this.GetType().GetProperties().Select(pi => pi.Name).ToList();
}
//returns a list of names of the property types
public List<string> GetMemberTypeNames
{
return this.GetType().GetProperties().Select(pi => pi.PropertyType.Name).ToList();
}
//indexer that uses the property name to get the value
//since you are mixing types, you can't get more specific than object
public object this[string property]
{
get { return this.GetType().GetProperty(property).GetValue(this); }
set { this.GetType().GetProperty(property).SetValue(this, value); }
}
//indexer that uses the property index in the properties array to get the value
public object this[int index]
{
get { return this.GetType().GetProperties()[index].GetValue(this); }
set { this.GetType().GetProperties()[index].SetValue(this, value); }
}
请注意,所有这些方法都非常缓慢,因为一般情况下,反射是缓慢的。你可以试着缓存一些东西来加快速度。
此外,最后一种方法是完全危险。它将(尝试)读取和写入一个没有保证顺序的数组。事实上,文件规定:
GetProperties方法不返回特定顺序,如字母顺序或声明顺序。您的代码不得取决于返回属性的顺序,因为顺序各不相同。
例如,如果您将类更改为:
public class WineCellar
{
public string year;
public string region;
public string wine;
public double nrbottles;
}
并且您已经习惯于使用winecellar[1] = "Pinot Noir"
,它现在很可能会更新region
属性,而不是wine
属性。
这就是实现Members方法的方式(如果您希望属性名称为字符串)
public List<string> Members()
{
List<string> propNames = new List<string>();
foreach (var prop in typeof(WineCellar).GetProperties())
{
propNames.Add(prop.Name);
}
return propNames;
}
这就是你将如何实现类型(在相同的情况下)
public List<string> Types()
{
List<string> propTypes = new List<string>();
foreach (var prop in typeof(WineCellar).GetProperties())
{
propTypes.Add(prop.PropertyType.ToString());
}
return propTypes ;
}
最后一件事,如果你想得到像这样的参数值,你可以在类中做一个简单的索引器,比如
public string this[int n]
{
get
{
int current = 0;
foreach (var prop in typeof(WineCellar).GetProperties())
{
if (current == n)
return prop.GetValue(this, null).ToString();
current++;
}
return null;
}
}
但是要使这些方法起作用,您应该将变量更改为类似的属性
public class WineCellar
{
public string Year { get; set; }
public string Wine { get; set; }
public double Nrbottles { get; set; }
}
您可以使用反射
foreach (var prop in typeof(WineCellar).GetProperties())
{
if (prop.PropertyType == typeof(double) || prop.PropertyType == typeof(double?))
{
}
}
要获得值,可以执行以下操作:
prop.GetValue(obj);