读书人

GetType后续.下一个举的例子有局限性

发布时间: 2012-12-15 15:16:03 作者: rapoo

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判断方便得多。

读书人网 >C#

热点推荐