首页 新闻 会员 周边 捐助

C# 委托和反射的一个问题,求大虾进来指点

0
[已解决问题] 解决于 2014-01-25 14:22

有一个方法,它有个字符串参数,这个参数是个类的名称。

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;

╰☆炫〃╰芯苡╯的主页 ╰☆炫〃╰芯苡╯ | 菜鸟二级 | 园豆:213
提问于:2014-01-08 20:35
< >
分享
最佳答案
1

当然放不进去了,因为你的 Type T 定义了一个变量,而 Func<T,bool> 的第一个泛型参数要求填写的是类型。你要记住,泛型参数是在编译时确定的。

如果你只知道类的名字,你只能使用反射:

void Test(string classname)

{

    Type T=Type.GetType(classname);

    Func<object,bool> exp=c=>{ // 用反射获取 flag 的元数据,并读取 c 上的 flag 值同 true 比较};

}

奖励园豆:5
Launcher | 高人七级 |园豆:45050 | 2014-01-09 09:22

 Type T 定义了一个变量,是哦~!!- - 一直以为GetType()得到的是个类型,误区。谢谢。

╰☆炫〃╰芯苡╯ | 园豆:213 (菜鸟二级) | 2014-01-11 19:30
其他回答(4)
0

classname表示的类应该有同一个父类或者实现了同一个接口吧,不然怎么知道它有flag属性呢。

如果有同样的父类或者接口A,那么直接用Func<A,bool> exp=c=>c.flag==true;

诶碧司 | 园豆:1912 (小虾三级) | 2014-01-09 00:06

是有,但是flag是继承类的成员,不是基类的,我有多个继承类,而且有不同的成员,但你写成Func<A,bool> exp=c=>c.flag==true时,flag是访问不到的。再说c.flag==true是我简化了条件,是想让问题好看明白,在这当然不只这么一个条件。左想右想,可能还是要采用 Launcher的提议,用反射了。

支持(0) 反对(0) ╰☆炫〃╰芯苡╯ | 园豆:213 (菜鸟二级) | 2014-01-11 19:27
0

定位一个类需要命名空间+类名,光一个类名gettype不出来的

而且你在方法里建个委托是要干嘛

吴瑞祥 | 园豆:29449 (高人七级) | 2014-01-09 09:11
0

你可以定义一个接口 或者抽象类 里面可以什么都不写 让这些类实现这个接口 或者继承抽象类 这样就能满足你的要求了 把T换成接口 或者抽象类 就可以了

wolfy | 园豆:2636 (老鸟四级) | 2014-01-09 09:32

是有,但是flag是继承类的成员,不是基类的,我有多个继承类,而且有不同的成员,但你写成Func<A,bool> exp=c=>c.flag==true时,flag是访问不到的。再说c.flag==true是我简化了条件,是想让问题好看明白,在这当然不只这么一个条件。左想右想,可能还是要采用 Launcher的提议,用反射了。

支持(0) 反对(0) ╰☆炫〃╰芯苡╯ | 园豆:213 (菜鸟二级) | 2014-01-11 19:28
0

你可以定义一个大类包括着他们,到时候返回时返回这个大类。你就可以直接用这样的形式了

妍珊 | 园豆:1169 (小虾三级) | 2014-01-09 10:03

定义一个大类是不可能的。。。。这样就要几个对象混在一起了,这不够明确。

支持(0) 反对(0) ╰☆炫〃╰芯苡╯ | 园豆:213 (菜鸟二级) | 2014-01-11 19:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册