GetType后续..上一个举的例子有局限性,还是说原题吧.

慧眼识狗熊 2012-12-03 09:19:59
泛型函数f<T>(T dt).调用前只知道参数dt,是object类型的。

除了用if语句判断后多次调用,或者类似的方法。能不能一句搞定,类似f<typeof(dt)>(dt).这个type就是dt的类型。

因为函数中有需要根据T的属性名称取值处理,所以不能直接用object。
...全文
214 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyangzu01 2015-01-19
  • 打赏
  • 举报
回复
GetMethoc 这个函数 c# 找不到啊。
wuyangzu01 2015-01-19
  • 打赏
  • 举报
回复
楼主你好,我遇到了 同样的问题: 但是 没看明白 C# code?1typeof(class).GetMethoc("f").MakeGenericMethod(dt.GetType()).Invoke(null,new Ojbect[]{dt}); 的思路怎么实现 Type ttype = Type.GetType(className,true); DoSomething<ttype > ();的效果. 我是个小 菜菜,望楼主 能详细 指定一下。
qldsrx 2012-12-04
  • 打赏
  • 举报
回复
因为你无法传递实际类型,类型需要通过反射得到,那么方法的调用就只能通过反射来调用,所以这已经是最简便的做法了,比用if判断方便得多。
慧眼识狗熊 2012-12-04
  • 打赏
  • 举报
回复
引用 15 楼 qldsrx 的回复:
可能是楼主你的问题表述有问题,你是不是想问这个给定的泛型方法能否通过反射去掉用啊。给你一段示例代码,也许是你想要的: C# code?1typeof(class).GetMethoc("f").MakeGenericMethod(dt.GetType()).Invoke(null,new Ojbect[]{dt});
嗯 就是个意思。难道只能用这种方法来调用么? 有没有更简便的?
qldsrx 2012-12-04
  • 打赏
  • 举报
回复
可能是楼主你的问题表述有问题,你是不是想问这个给定的泛型方法能否通过反射去掉用啊。给你一段示例代码,也许是你想要的:
typeof(class).GetMethoc("f").MakeGenericMethod(dt.GetType()).Invoke(null,new Ojbect[]{dt});
慧眼识狗熊 2012-12-04
  • 打赏
  • 举报
回复
引用 11 楼 wddw1986 的回复:
引用 10 楼 small21 的回复:引用 9 楼 qiaohuyue 的回复:反射 不好用啊,反射用来新建一个实例可以,但是要得到类型 再作为参数传入泛型函数就没办法。 泛型其实是设计时概念,任何把泛型用在运行时的设计都是错误的。
具体问题请看下我对楼上的回复。 如果真的是在设计时就指定的话那就没办法了,但是我百度了下,c#的泛型应该是运行时的,只是我不知道怎么将dt的类型表达出来再赋值给f<T>。
慧眼识狗熊 2012-12-04
  • 打赏
  • 举报
回复
引用 12 楼 dabingsou 的回复:
不知道你的具体需求,知道类型做什么 感觉继承基类或实现接口更适合你的需求
具体的问题我已经通过别的方法解决了。 我现在想知道的是这个想法能不能实现。 即 通过dt对象得到的类型 能不能当做‘类型参数’传入 f<T>(dt). 如果可以,‘类型参数’怎么声明。
dabingsou 2012-12-04
  • 打赏
  • 举报
回复
不知道你的具体需求,知道类型做什么 感觉继承基类或实现接口更适合你的需求
cheng2005 2012-12-04
  • 打赏
  • 举报
回复
引用 10 楼 small21 的回复:
引用 9 楼 qiaohuyue 的回复:反射 不好用啊,反射用来新建一个实例可以,但是要得到类型 再作为参数传入泛型函数就没办法。
泛型其实是设计时概念,任何把泛型用在运行时的设计都是错误的。
慧眼识狗熊 2012-12-04
  • 打赏
  • 举报
回复
引用 9 楼 qiaohuyue 的回复:
反射
不好用啊,反射用来新建一个实例可以,但是要得到类型 再作为参数传入泛型函数就没办法。
XBodhi. 2012-12-04
  • 打赏
  • 举报
回复
反射
Hauk 2012-12-04
  • 打赏
  • 举报
回复
引用 7 楼 small21 的回复:
就是说能不能再调用前通过dt.gettype()确定一个类型。 如果可以,类似这样 class cl = dt.gettype(); 然后可以调用f<cl>(dt);
不行的,typeof() GetType()返回的其实是一个对象(类型对象)。 而泛型的类型参数要求传入一个编译器可识别的类型。
慧眼识狗熊 2012-12-04
  • 打赏
  • 举报
回复
就是说能不能再调用前通过dt.gettype()确定一个类型。 如果可以,类似这样 class cl = dt.gettype(); 然后可以调用f<cl>(dt);
慧眼识狗熊 2012-12-04
  • 打赏
  • 举报
回复
引用 5 楼 hjywyj 的回复:
类似f<typeof(dt)>(dt).这个type就是dt的类型 那你还要dt有啥用啊? 直接实例化一个T就行
在调用前只有dt这一个参数,没有类型参数T,除非我写语句判断出来之后直接写类型。 而且f<dt.GetType()>(dt)这个调用方法不对的,GetType得到的是type类型,不是可用的类型。
  • 打赏
  • 举报
回复
类似f<typeof(dt)>(dt).这个type就是dt的类型 那你还要dt有啥用啊? 直接实例化一个T就行
慧眼识狗熊 2012-12-04
  • 打赏
  • 举报
回复
引用 3 楼 haukwong 的回复:
引用 2 楼 small21 的回复:引用 1 楼 haukwong 的回复:那就用dynamic啊。 在家没有环境,dynamic能用作泛型的输入? f<dynamic>(dt)? 可以,但是没这样输入就没什么意义了。 你可以看看下面的用法,不太清楚你的具体需求: C# code?12345678910111213141516171819202122232……
感觉不太行,现在我想要的就是调用时 f<T>(dt)中的传入类型参数T是通过dt得到的,没办法表示。
Hauk 2012-12-03
  • 打赏
  • 举报
回复
引用 2 楼 small21 的回复:
引用 1 楼 haukwong 的回复:那就用dynamic啊。 在家没有环境,dynamic能用作泛型的输入? f<dynamic>(dt)?
可以,但是没这样输入就没什么意义了。 你可以看看下面的用法,不太清楚你的具体需求:

        static void Main(string[] args)
        {
            Student stu = new Student();
            Say(stu);//I'm student.

            Teacher tea = new Teacher();
            Say(tea);//I'm teacher.

            Say<Student>();//I'm student.
            Say<Teacher>();//I'm teacher.
        }

        static void Say(dynamic obj)
        {
            obj.Say();
        }

        static void Say<T>()
        {
            dynamic obj = Activator.CreateInstance(typeof(T));
            obj.Say();
        }

        struct Student
        {
            public void Say()
            {
                Console.WriteLine("I'm student.");
            }
        }

        class Teacher
        {
            public void Say()
            {
                Console.WriteLine("I'm teacher.");
            }
        }
慧眼识狗熊 2012-12-03
  • 打赏
  • 举报
回复
引用 1 楼 haukwong 的回复:
那就用dynamic啊。
在家没有环境,dynamic能用作泛型的输入? f<dynamic>(dt)?
Hauk 2012-12-03
  • 打赏
  • 举报
回复
那就用dynamic啊。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧