列出自定义类成员和类型

本文关键字:类型 成员 自定义 | 更新日期: 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);