当前位置:编程学习 > C#/ASP.NET >>

我并不知道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楼都可以。 --------------------编程问答--------------------
引用楼主 jezta 的回复:
我并不知道T,我只能知道T的类型(Type)
 比如我定义了一个泛型方法如下,
 public void DoSth <T>(T t)
 {
     ...
 }
 当我要调用这个方法的时候我并不知道T,我只能知道T的类型(Type)
 如
 DoSth<typeof(string)>("hello");
 但是这样做系统报错,谁能告诉我应该怎么写,谢谢.

那就没办法了~ --------------------编程问答--------------------
我觉得也是不行的。

--------------------编程问答--------------------
引用 1 楼 bwangel 的回复:
DoSth <String>("hello");


这样应该没有问题的啊 --------------------编程问答--------------------
引用 1 楼 bwangel 的回复:
DoSth <String>("hello");

正解 --------------------编程问答-------------------- 泛型是这样用的? --------------------编程问答-------------------- 直接DoSth("hello")就可以了,编译器能判断出泛型参数的类型 --------------------编程问答--------------------
引用 9 楼 danjiewu 的回复:
直接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做判断吧。 --------------------编程问答--------------------  冒似简单。。。一楼二楼正解。。均可以 --------------------编程问答--------------------
引用 11 楼 jezta 的回复:
不好意思 ,我没表达明白。我的意思是如果我 定义了一个实体类,比如,
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);
这个样好像报错。


直接DoSth <user>(info);不行么? --------------------编程问答--------------------
引用 15 楼 septemson 的回复:
引用 11 楼 jezta 的回复:
 不好意思 ,我没表达明白。我的意思是如果我 定义了一个实体类,比如,
 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);
 这个样好像报错。


 直接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));
    }
}

//泛型方法必须是配合 父类,接口 才有用的,一个单独的类,没有继承任何父类,没有实现任何接口,写个泛型方法是没意义的
--------------------编程问答--------------------
引用 11 楼 jezta 的回复:
不好意思 ,我没表达明白。我的意思是如果我 定义了一个实体类,比如,
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);
这个样好像报错。
我二楼都回你了,非要无视也真没办法了…… --------------------编程问答-------------------- 谢谢大家,学到了 很多啊 。 --------------------编程问答--------------------
引用 9 楼 danjiewu 的回复:
直接DoSth("hello")就可以了,编译器能判断出泛型参数的类型


???
9楼正确,语法糖,语法糖,交给编译器的做的事情,你非要自己做了。编译器自己给识别类型,你没必要操心的 --------------------编程问答-------------------- 同上,DoSth (info)就可以,不用写尖括号。

使用.net4,有了Dynamic,就更厉害了,几乎可以把反射忘掉了。不过,Dynamic也会让我们看到更多完全看不懂(连编译器也无法检查出设计错误)的代码来。不知道Dynamic是祸是福,但是可以肯定地会有更多人用c#。 --------------------编程问答-------------------- 关于对泛型的反射方法,可以google“装配脑袋”的一些VB.NET文章。 --------------------编程问答--------------------
引用 1 楼 bwangel 的回复:
DoSth <String>("hello");


你的typeof(string)我就不知道是什么意思,1L的方法是对的 --------------------编程问答-------------------- 运行时判断参数类型,貌似VB.NET早就实现了。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,