C# 如何将PropertyInfo[]转换为Dictionary<;字符串,字符串>;?
实际上,我需要在mvc下拉列表中显示类的属性。我用反射来得到这些东西。但现在我的问题是将它们作为键值对显示在dropdownlist中 我正在使用下面的代码C# 如何将PropertyInfo[]转换为Dictionary<;字符串,字符串>;?,c#,asp.net-mvc-4,reflection,dictionary,html.dropdownlistfor,C#,Asp.net Mvc 4,Reflection,Dictionary,Html.dropdownlistfor,实际上,我需要在mvc下拉列表中显示类的属性。我用反射来得到这些东西。但现在我的问题是将它们作为键值对显示在dropdownlist中 我正在使用下面的代码 public static Dictionary<string,string> SetProperties() { Type T = Type.GetType("Entity.Data.Contact"); PropertyInfo[] resultcontactproperties =
public static Dictionary<string,string> SetProperties()
{
Type T = Type.GetType("Entity.Data.Contact");
PropertyInfo[] resultcontactproperties = T.GetProperties();
ViewContactModel viewobj = new ViewContactModel();
viewobj.properties = resultcontactproperties;
Dictionary<string, string> dic = new Dictionary<string, string>();
return dic;
}
publicstaticdictionary SetProperties()
{
Type T=Type.GetType(“Entity.Data.Contact”);
PropertyInfo[]resultcontactproperties=T.GetProperties();
ViewContactModel viewobj=新的ViewContactModel();
viewobj.properties=resultcontactproperties;
Dictionary dic=新字典();
返回dic;
}
那么,如何将它们转换为字典,以便在下面的下拉列表中找到它们
@Html.DropDownListFor(m=>m.properties, new SelectList(Entity.Data.ContactManager.SetProperties(),"",""), "Select a Property")
Well this is my ViewContactModel
public class ViewContactModel
{
public List<Entity.Data.Contact> Contacts;
public int NoOfContacts { get; set; }
public Paging pagingmodel { get; set; }
public PropertyInfo[] properties { get; set; }
}
In the view I'm using this model
@Html.DropDownListFor(m=>m.properties,新选择列表(Entity.Data.ContactManager.SetProperties(),“”,“”),“选择属性”)
这是我的模型
公共类视图模型
{
公开名单联系人;
public int NoOfContacts{get;set;}
公共分页分页模型{get;set;}
公共属性info[]属性{get;set;}
}
在视图中,我正在使用此模型
如果必须使用字典,并假设每个下拉项的名称和值都是属性名称本身,则可以使用以下内容:
public static Dictionary<string, string> GetProperties<T>(params string[] propNames)
{
PropertyInfo[] resultcontactproperties = null;
if(propNames.Length > 0)
{
resultcontactproperties = typeof(T).GetProperties().Where(p => propNames.Contains(p.Name)).ToArray();
}
else
{
resultcontactproperties = typeof(T).GetProperties();
}
var dict = resultcontactproperties.ToDictionary(propInfo => propInfo.Name, propInfo => propInfo.Name);
return dict;
}
@Html.DropDownListFor(m=>m.properties, new SelectList(
Entity.Data.ContactManager.GetProperties<Contact>(),"Key","Value"),
"Select a Property")
publicstaticdictionary GetProperties(参数字符串[]propNames)
{
PropertyInfo[]resultcontactproperties=null;
如果(propNames.Length>0)
{
resultcontactproperties=typeof(T).GetProperties().Where(p=>propNames.Contains(p.Name)).ToArray();
}
其他的
{
resultcontactproperties=typeof(T).GetProperties();
}
var dict=resultcontactproperties.ToDictionary(propInfo=>propInfo.Name,propInfo=>propInfo.Name);
返回命令;
}
@DropDownListFor(m=>m.properties,新选择列表(
Entity.Data.ContactManager.GetProperties(),“键”,“值”),
“选择一个属性”)
那么,您试图从哪个对象获取值?您有了一个新的ViewContactModel
,但可能实际上并不包含联系人。这里没有关于从哪个联系人获取值的信息…密钥是什么,您想要的值是什么?我不想要特定的联系人。。我只在类Entity.Data.Contact中查找属性。它有名字、手机、电子邮件、州、城市、国家等属性。我想在下拉列表中显示这些属性。阿比吉特先生,你能帮我吗?答案更新。可以为所需的属性名称传入字符串数组。GetProperties(“FirstName”、“LastName”)如果需要所有属性,只需使用GetProperties()。希望这有助于您在编译时知道属性的名称,为什么需要反射?我假设他需要属性值而不是名称两次,在这种情况下是有意义的。@MattDavey:同意,如果您事先知道属性名称,那么使用反射就没有多大意义了。让GetProperties方法接受这些名称的唯一好处(我能想到)是,体验将是一致的,并且无论是否指定了属性名称,您都会得到一个字典。除非OP提供关于用例的进一步见解,否则很难判断这是否是最好的方法。只要我的2美分。。。