首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2012-12-15 
GetType后续..上一个举的例子有局限性,还是说原题吧.泛型函数fT(T dt).调用前只知道参数dt,是object类型

GetType后续..上一个举的例子有局限性,还是说原题吧.
泛型函数f<T>(T dt).调用前只知道参数dt,是object类型的。

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

因为函数中有需要根据T的属性名称取值处理,所以不能直接用object。

[最优解释]
可能是楼主你的问题表述有问题,你是不是想问这个给定的泛型方法能否通过反射去掉用啊。给你一段示例代码,也许是你想要的:

typeof(class).GetMethoc("f").MakeGenericMethod(dt.GetType()).Invoke(null,new Ojbect[]{dt});

[其他解释]
引用:
引用:那就用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.");
            }
        }

[其他解释]
反射
[其他解释]
引用:
引用:反射

不好用啊,反射用来新建一个实例可以,但是要得到类型 再作为参数传入泛型函数就没办法。


泛型其实是设计时概念,任何把泛型用在运行时的设计都是错误的。
[其他解释]
那就用dynamic啊。
[其他解释]
引用:
那就用dynamic啊。


在家没有环境,dynamic能用作泛型的输入?  f<dynamic>(dt)?
[其他解释]
引用:
引用:引用:那就用dynamic啊。

在家没有环境,dynamic能用作泛型的输入?  f<dynamic>(dt)?
可以,但是没这样输入就没什么意义了。
你可以看看下面的用法,不太清楚你的具体需求:
C# code?12345678910111213141516171819202122232……


感觉不太行,现在我想要的就是调用时 f<T>(dt)中的传入类型参数T是通过dt得到的,没办法表示。
[其他解释]
类似f<typeof(dt)>(dt).这个type就是dt的类型

那你还要dt有啥用啊?
直接实例化一个T就行
[其他解释]
引用:
类似f<typeof(dt)>(dt).这个type就是dt的类型

那你还要dt有啥用啊?
直接实例化一个T就行


在调用前只有dt这一个参数,没有类型参数T,除非我写语句判断出来之后直接写类型。

而且f<dt.GetType()>(dt)这个调用方法不对的,GetType得到的是type类型,不是可用的类型。
[其他解释]
就是说能不能再调用前通过dt.gettype()确定一个类型。

如果可以,类似这样 class cl = dt.gettype();

然后可以调用f<cl>(dt);
[其他解释]
引用:
就是说能不能再调用前通过dt.gettype()确定一个类型。

如果可以,类似这样 class cl = dt.gettype();

然后可以调用f<cl>(dt);

不行的,typeof()   GetType()返回的其实是一个对象(类型对象)。
而泛型的类型参数要求传入一个编译器可识别的类型。
[其他解释]
引用:
反射


不好用啊,反射用来新建一个实例可以,但是要得到类型 再作为参数传入泛型函数就没办法。
[其他解释]
不知道你的具体需求,知道类型做什么
感觉继承基类或实现接口更适合你的需求
[其他解释]
引用:
不知道你的具体需求,知道类型做什么
感觉继承基类或实现接口更适合你的需求


具体的问题我已经通过别的方法解决了。  我现在想知道的是这个想法能不能实现。

即 通过dt对象得到的类型  能不能当做‘类型参数’传入 f<T>(dt).   如果可以,‘类型参数’怎么声明。
[其他解释]
引用:
引用:引用:反射

不好用啊,反射用来新建一个实例可以,但是要得到类型 再作为参数传入泛型函数就没办法。
泛型其实是设计时概念,任何把泛型用在运行时的设计都是错误的。


具体问题请看下我对楼上的回复。

如果真的是在设计时就指定的话那就没办法了,但是我百度了下,c#的泛型应该是运行时的,只是我不知道怎么将dt的类型表达出来再赋值给f<T>。
[其他解释]
引用:
可能是楼主你的问题表述有问题,你是不是想问这个给定的泛型方法能否通过反射去掉用啊。给你一段示例代码,也许是你想要的:
C# code?1typeof(class).GetMethoc("f").MakeGenericMethod(dt.GetType()).Invoke(null,new Ojbect[]{dt});



嗯 就是个意思。难道只能用这种方法来调用么?  有没有更简便的?
[其他解释]
因为你无法传递实际类型,类型需要通过反射得到,那么方法的调用就只能通过反射来调用,所以这已经是最简便的做法了,比用if判断方便得多。

热点排行