有一个方法,它有个字符串参数,这个参数是个类的名称。
void Test(string classname){
Type T=Type.GetType(classname);
Func<T,bool> exp=c=>c.flag==true;
//以上代码省略
//……
}
本来我的思路是这样的,但是写到Func<T,bool>时,T是放不进这里来的,我只知道类的名字,而且这还不一定是哪个类,这两句要怎么改。(不能改成下边这样,因为我只知道类的名字)
void Test<T>(){
Func<T,bool> exp=c=>c.flag==true;
当然放不进去了,因为你的 Type T 定义了一个变量,而 Func<T,bool> 的第一个泛型参数要求填写的是类型。你要记住,泛型参数是在编译时确定的。
如果你只知道类的名字,你只能使用反射:
void Test(string classname)
{
Type T=Type.GetType(classname);
Func<object,bool> exp=c=>{ // 用反射获取 flag 的元数据,并读取 c 上的 flag 值同 true 比较};
}
Type T 定义了一个变量,是哦~!!- - 一直以为GetType()得到的是个类型,误区。谢谢。
classname表示的类应该有同一个父类或者实现了同一个接口吧,不然怎么知道它有flag属性呢。
如果有同样的父类或者接口A,那么直接用Func<A,bool> exp=c=>c.flag==true;
是有,但是flag是继承类的成员,不是基类的,我有多个继承类,而且有不同的成员,但你写成Func<A,bool> exp=c=>c.flag==true时,flag是访问不到的。再说c.flag==true是我简化了条件,是想让问题好看明白,在这当然不只这么一个条件。左想右想,可能还是要采用 Launcher的提议,用反射了。
定位一个类需要命名空间+类名,光一个类名gettype不出来的
而且你在方法里建个委托是要干嘛
你可以定义一个接口 或者抽象类 里面可以什么都不写 让这些类实现这个接口 或者继承抽象类 这样就能满足你的要求了 把T换成接口 或者抽象类 就可以了
是有,但是flag是继承类的成员,不是基类的,我有多个继承类,而且有不同的成员,但你写成Func<A,bool> exp=c=>c.flag==true时,flag是访问不到的。再说c.flag==true是我简化了条件,是想让问题好看明白,在这当然不只这么一个条件。左想右想,可能还是要采用 Launcher的提议,用反射了。
你可以定义一个大类包括着他们,到时候返回时返回这个大类。你就可以直接用这样的形式了
定义一个大类是不可能的。。。。这样就要几个对象混在一起了,这不够明确。