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});
[其他解释]可以,但是没这样输入就没什么意义了。
你可以看看下面的用法,不太清楚你的具体需求:
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能用作泛型的输入? f<dynamic>(dt)?
[其他解释]感觉不太行,现在我想要的就是调用时 f<T>(dt)中的传入类型参数T是通过dt得到的,没办法表示。
[其他解释]类似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);
[其他解释]不行的,typeof() GetType()返回的其实是一个对象(类型对象)。
而泛型的类型参数要求传入一个编译器可识别的类型。
[其他解释]不好用啊,反射用来新建一个实例可以,但是要得到类型 再作为参数传入泛型函数就没办法。
[其他解释]不知道你的具体需求,知道类型做什么
感觉继承基类或实现接口更适合你的需求
[其他解释]具体的问题我已经通过别的方法解决了。 我现在想知道的是这个想法能不能实现。
即 通过dt对象得到的类型 能不能当做‘类型参数’传入 f<T>(dt). 如果可以,‘类型参数’怎么声明。
[其他解释]具体问题请看下我对楼上的回复。
如果真的是在设计时就指定的话那就没办法了,但是我百度了下,c#的泛型应该是运行时的,只是我不知道怎么将dt的类型表达出来再赋值给f<T>。
[其他解释]嗯 就是个意思。难道只能用这种方法来调用么? 有没有更简便的?
[其他解释]因为你无法传递实际类型,类型需要通过反射得到,那么方法的调用就只能通过反射来调用,所以这已经是最简便的做法了,比用if判断方便得多。