2011-04-22 172 views
0

对不明确的标题,不完全确定如何描述它C# - 获取对象名称?

我有一个菜单列表的自定义列表。 CatalogueMenu有一个枚举这样我就可以通过颜色列表中环路它

public class CatalogueMenu 
{ 
    private List<List<MenuItem>> MenuList = new List<List<MenuItem>>(); 

    public List<MenuItem> Reds { get; private set; } 
    public List<MenuItem> Blues { get; private set; } 
    public List<MenuItem> Greens { get; private set; } 
    public List<MenuItem> Yellows { get; private set; } 

    public CatalogueMenu() 
    { 
     Reds = new List<MenuItem>(); 
     Blues = new List<MenuItem>(); 
     Greens = new List<MenuItem>(); 
     Yellows = new List<MenuItem>(); 

     MenuList.Add(Reds); 
     MenuList.Add(Blues); 
     MenuList.Add(Greens); 
     MenuList.Add(Yellows); 
    } 

    public IEnumerator<List<MenuItem>> GetEnumerator() 
    { 
     return this.MenuList.GetEnumerator(); 
    } 
} 

public class MenuItem 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

在我MVC3应用程序,我通过列表循环,但我也想显示每个列表如名称

蓝调 - 列表 - 的 - 布鲁斯 红人 - 列表 - 的 - 红魔

一)我可以从实际列表对象本身的列表名称? 或 B)难道我有那么它包含名称的字符串创建颜色列表中的自定义类,以及一个清单,以及

<ul> 
@foreach (var itemList in Model) 
{ 
    <li class="listName">**@itemList.Name or something like that?**</li> 
    foreach (var item in itemList) 
    { 
     <li>@Html.ActionLink(
       item.Name, 
       "Browse", 
       "Catalogue", 
       Request.QueryString.ToRouteValueDictionary().AddOrUpdate(**itemList.Name??**, item.ID), 
       null) 
     </li> 
    } 
} 
</ul> 
+0

你当然可以在运行时获取对象的名称;这就是所谓的[反射](http://csharp.net-tutorials.com/reflection/introduction/)。尽管如此,仍在研究你的问题的其余部分。 – 2011-04-22 23:18:32

+0

@Albert Perrien:不,对象没有名字。您可以使用反射来获取包含对该对象的引用的属性的名称,但只能通过遍历这些属性并获取它们的值来将它们与该对象的引用进行比较。 – Guffa 2011-04-22 23:26:47

+0

@Albert:假设“名称”的意思是“引用它的变量的名称”,我不得不怀疑它是可能的并且它是有意义的。没有这样的东西作为一个对象的名称 - 对于一个给定的对象,有任何数字(包括零)的名称引用它。顺便说一下,发现它们非常昂贵。顺便说一下,该数字与实际引用对象的数量无关。 – delnan 2011-04-22 23:28:08

回答

0

可能有不同的方式来获取此,但TypeDescriptor类(System.ComponentModel)将提供您正在寻找的信息。

var names = new List<string>(); 
var menu = new CatalogueMenu(); 
var descriptors = TypeDescriptor.GetProperties(menu); 

foreach (PropertyDescriptor descriptor in descriptors) 
{ 
    names.Add(descriptor.Name); 
} 

名称现在将包含“红人”,“蓝调”等

+0

感谢大家的意见。这里的东西几乎是我在找的东西(希望我能更直接地做,而不用建立单独的列表,但是哦)。我想我可以将它构建到CatalogueMenu中,这样我就可以制作CatalogueMenu.GetNames或其他东西。可能有点超过顶部,但我很开心学习:) – mejobloggs 2011-04-24 11:21:34

0

一)
不,你不能得到名称来自列表本身,因为对象没有名称。你正在寻找的是包含对列表引用的变量的名称,并且列表对象没有引用回包含对它的引用的变量。

b)
有不同的解决方法,但为颜色列表创建自定义类是一个很好的解决方案,也许是最好的解决方案。