我并不知道T,我只能知道T的类型(Type)
我并不知道T,我只能知道T的类型(Type)比如我定义了一个泛型方法如下,
public void DoSth<T>(T t)
{
...
}
当我要调用这个方法的时候我并不知道T,我只能知道T的类型(Type)
如
DoSth<typeof(string)>("hello");
但是这样做系统报错,谁能告诉我应该怎么写,谢谢. --------------------编程问答-------------------- DoSth<String>("hello"); --------------------编程问答-------------------- 反射~
MethodInfo mi = this.GetType().GetMethod("DoSth", BindingFlags.Instance| BindingFlags.Public);
mi = mi.MakeGenericMethod(你知道的类型Type实例);
object ret=mi.Invoke(this, new object[] { 要传入的那个T型参数});
ret就是返回值 --------------------编程问答-------------------- 不知道你什么意思,
1楼2楼都可以。 --------------------编程问答--------------------
那就没办法了~ --------------------编程问答--------------------
我觉得也是不行的。
--------------------编程问答--------------------
这样应该没有问题的啊 --------------------编程问答--------------------
正解 --------------------编程问答-------------------- 泛型是这样用的? --------------------编程问答-------------------- 直接DoSth("hello")就可以了,编译器能判断出泛型参数的类型 --------------------编程问答--------------------
对啊,这里只是一个方法而已! --------------------编程问答-------------------- 不好意思 ,我没表达明白。我的意思是如果我 定义了一个实体类,比如,
namespace My.namespace
public class user
{
public ID{get;set;}
public Name{get;set;}
}
我现在只有一个实体类的实例info,和这个实体类的TYPE字符串"My.namespace.user",那么我该怎么调用那个方法?
Type type=Type.GetType("My.namespace.user");
DoSth <type>(info);
这个样好像报错。 --------------------编程问答-------------------- switch( type){
case "string":
DoSth<string>("hello");
break;
}
--------------------编程问答-------------------- 估计你这类型是动态的,使用case做判断吧。 --------------------编程问答-------------------- 冒似简单。。。一楼二楼正解。。均可以 --------------------编程问答--------------------
直接DoSth <user>(info);不行么? --------------------编程问答--------------------
问题是,类型是动态确定的,而不是user这个固定的。
lz的问题是想要在运行时确定范型类型,这个与范型的本意(静态确定类型以提供静态类型检查)相距甚远,这个在现在或者是以后都不可能被范型支持,就好像你想让一个男的生小孩一样,by design就是不行的。 --------------------编程问答-------------------- 那样的话,要么通过反射调用,要么实现一个非泛型的版本
比如IList<T>和IList --------------------编程问答--------------------
1. user类 继承一个父类...或者接口
2.只能判断了
if(info.GetType() == typeof(user))
{
DoSth <user>(info); //这样做达不到泛型方法的目的了...
}
--------------------编程问答--------------------
--------------------编程问答-------------------- 我二楼都回你了,非要无视也真没办法了…… --------------------编程问答-------------------- 谢谢大家,学到了 很多啊 。 --------------------编程问答--------------------
public interface IPerson
{
string Name { get; set; }
}
class User : IPerson
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public User(string name)
{
this.name = name;
}
}
class Person : IPerson
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public Person(string name)
{
this.name = name;
}
}
public class Test
{
public Test()
{}
public string GetName<T>(T t) where T : IPerson
{
return t.Name;
}
private void button10_Click(object sender, EventArgs e)
{
User u = new User("aaa");
MessageBox.Show(this.GetName<IPerson>(u));
}
}
//泛型方法必须是配合 父类,接口 才有用的,一个单独的类,没有继承任何父类,没有实现任何接口,写个泛型方法是没意义的
???
9楼正确,语法糖,语法糖,交给编译器的做的事情,你非要自己做了。编译器自己给识别类型,你没必要操心的 --------------------编程问答-------------------- 同上,DoSth (info)就可以,不用写尖括号。
使用.net4,有了Dynamic,就更厉害了,几乎可以把反射忘掉了。不过,Dynamic也会让我们看到更多完全看不懂(连编译器也无法检查出设计错误)的代码来。不知道Dynamic是祸是福,但是可以肯定地会有更多人用c#。 --------------------编程问答-------------------- 关于对泛型的反射方法,可以google“装配脑袋”的一些VB.NET文章。 --------------------编程问答--------------------
你的typeof(string)我就不知道是什么意思,1L的方法是对的 --------------------编程问答-------------------- 运行时判断参数类型,貌似VB.NET早就实现了。
补充:.NET技术 , C#