高分求关于自定义查询控件反射

小D2013 2016-05-12 11:15:59
public partial class UserControlSearch : UserControl
{
object DataSource; //我希望这个查询控件的datasource 是 object 或 ienumrable 类型 ,如果 object 类型对于 以后的反 射太复杂的话 ,定义为 ienumrable 也可以,最好不要再定义其他类型了,例如 为 table 之类的,这样限制太死
public UserControlSearch()
{
InitializeComponent();
}

public void Initialize(object DataSource)
{
this.DataSource = DataSource;
}

private List<string> GetFields() // 这里我希望能通过反射得到 相关字段,例如 如果datasource 实际是 datatable 的话,则应返回列名集合,如果 datasource 实际是 List<someentity> 那么应该返回 someentity 的 字段或属性集合
{
List<string> fieldNames=new List<string>();
Type t = this.DataSource.GetType();
。。。。。。。。。。。
。。。。。。。。。
return fieldNames;
}
}

以上问题 请高手指点
...全文
106 点赞 收藏 9
写回复
9 条回复
足球中国 2016年05月15日
ilist.GetType().GetGenericArguments()[0]; 是下面的这个作用。 List<someentity> 那么应该返回 someentity
回复 点赞
足球中国 2016年05月15日

		protected virtual IList GetListSource() {
			if(DataSource == null) return null;
			IListSource ls = DataSource as IListSource;
			if(ls != null) return ls.GetList();
			DataTable table = DataSource as DataTable;
			if(table != null) return table.DefaultView;
			IList list = DataSource as IList;
			return list;
		}
回复 点赞
小D2013 2016年05月14日
最好有谁做过类似查询控件,给提供一些好的建议
回复 点赞
秋的红果实 2016年05月13日

class BaseClass
{
    protected string Name;
    public virtual string name
    {
        get
        {
            return Name;
        }
        set
        {
            Name = value;
        }
    }
    public int age { set; get; }

}


string outPut = "";
List<BaseClass> bc = new List<BaseClass>();
PropertyInfo[] pi = bc.GetType().GetProperties();
foreach(PropertyInfo p in pi)
{
    outPut += p.Name + "<br />";
}

Response.Write(outPut);

输出的结果是: Capacity Count Item 可以看得出,对于list就不适合这么处理(用GetProperties()) 要不就用接口实现,对于datatable一种实现,对于list是另一种实现……
回复 点赞
马少华 2016年05月13日
也做过类似的需求。 数据源还是做成IEnumerable<object> 这种类型的吧。 然后根据需要再设置几个属性 public string Fields1{get;set;} public string Fields2{get;set;} public string Fields3{get;set;} 最后通过Fields1,fields2,fields3来反射数据源。 类似于Combobox 的displaymember,和valuemember
回复 点赞
ghao0 2016年05月13日
DataTable如何取Columns应该简单吧, object取属性或字段,上楼已经有示例了.
回复 点赞
ghao0 2016年05月13日
private List<string> GetFields() // 这里我希望能通过反射得到 相关字段,例如 如果datasource 实际是 datatable 的话,则应返回列名集合,如果 datasource 实际是 List<someentity> 那么应该返回 someentity 的 字段或属性集合 { List<string> fieldNames=new List<string>(); Type t = this.DataSource.GetType(); if(t is DateTable) { ... } else if (t is ...) { ... } return fieldNames; } }
回复 点赞
小D2013 2016年05月12日
版主,我希望这个数据源时比较通用的,反射会得到很多信息,我如何能确定 哪部分信息是实际我想要的字段名集合,这是个难点啊
回复 点赞
Type t = this.DataSource.GetType(); foreach (var 字段名 in t.GetPropertites()) { 字段名.Name就是你要的。 }
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告