首页 新闻 会员 周边 捐助

请教:c#泛型方法的使用

0
悬赏园豆:5 [已解决问题] 解决于 2021-06-10 16:24

初学泛型,请教各位大侠,
public class MyClass
{
//指定MyMethod方法用以执行类型为X的参数
public void MyMethod<X>(X x)
{
//
}

//此方法也可不指定方法参数
public void MyMethod<X>() 
{
    //
}

}

//调用泛型方法
MyClass myClass = new MyClass();
myClass.MyMethod<int>(3);
如上是我理解的简单泛型使用 即在方法名后边的<>中写入类型参数列表,比如T;再在后面的()中写入使用类型参数,比如T t1,实际调用泛型方法时,写入类型(int)和具体数值,但是我看到别人这样的写法(可查看附件),
private void CreateTestInstance<T>(RadioButton entryButton) where T : UserControl, ITestForm, new(){}
在实际调用时,使用的是CreateTestInstance<某某试验1>(rbtnTest1);此处的rbtnTest1为主窗体中的一个radiobutton,某某实验1为一个自定义控件(UserControl),也就是在声明泛型方法时,<>中写入了T,而其后面()中写入的是一个实际的类型,百度了一下,一些文章中说是重载用了这种写法,但是没搞懂这样写是否符合泛型方法声明,或是泛型方法到底可以如何声明,以及调用,
请大侠指点迷津,支出知识点的源头,我可以进一步学习,谢谢

rossi努力努力的主页 rossi努力努力 | 初学一级 | 园豆:8
提问于:2021-06-08 17:27
< >
分享
最佳答案
0

这是什么问题,泛型方法唯一必须的东西就是泛型参数,就是尖括号里面的类型,其他的地方可以随便写的。
你可以写一个泛型的无参方法

void Method<T>()
{
}

也可以写泛型的有参函数

void Method<T>(T t1)
{
}

void Method<T>(int value)
{
}

参数的类型和泛型方法的类型参数之间没有必然联系

收获园豆:5
拓拓 | 小虾三级 |园豆:1055 | 2021-06-08 19:26

是否可以这样理解,您说的
void Method<T>(T t1)
{
}
接受一个泛型参数,该泛型方法在实际使用时,指定泛型参数的类型,可以是int,可以是string或是其他,比如调用时可以使用method<int>(3);
而void Method<T>(int value)
{
}
是适用于int参数的专用版本,在调用时,只能是method<int>(3)
还请大侠多讲几句,先谢过了!

rossi努力努力 | 园豆:8 (初学一级) | 2021-06-08 21:18

@rossi1984: 你对泛型的理解有问题,泛型的类型参数是有三个作用的,举例说明


// 第一个作用,限制参数的类型
void Method<T>(T t1)
{
}
// 调用时,参数类型必须与类型参数一致,毕竟是T类型的参数
Method<int>(3);//正确
Method<int>(new object());//错误
//而下面这种调用的时候,你必须传int型参数进去,类型则可以随便写:
void Method<T>(int value)
{
}
Method<string>(3);//正确
Method<double>(new object());//错误

//第二种,规定返回值的类型
// 比如说强制类型转换的方法,传任意类型的变量进去,返回指定类型的变量出来
T As<T>(object value)
{
    return (T)value; 
}
// 比如说反序列化方法,传byte数组或者字符串进去,返回指定类型的变量出来
T Deserialize<T>(string value)
{
    T t = /*具体的反序列化方法*/;
    return t;
}

// 第三种,方法内部需要知道类型信息,一般用于反射相关的代码,比如动态创建指定类型变量之类的,上面的泛型反序列化方法也用到了这一点。
void Method<T>()
{
    var type = typeof(T);
    // 其他代码
}

你题目中的方法,如果没看错的话,应该是创建指定类型的控件,那个方法中应该是类似这样的代码:

T CreateInstance<T>(RadioButton entryButton) 
    where T : UserControl, ITestForm, new() 
{
    var control = (T)Activator.CreateInstance(typeof(T)); //创建指定类型实例,这是作用3
    if(entryButton.IsChecked)
    {
    }
    else
    {
    }
    return control; // 返回 T 类型的控件,这是作用2
}
···
这样可以理解吗
拓拓 | 园豆:1055 (小虾三级) | 2021-06-09 13:54

@拓拓: 受教,受教,谢谢

rossi努力努力 | 园豆:8 (初学一级) | 2021-06-10 16:23
其他回答(1)
0

理论上,他那个方法的定义应该是:

private CreateInstance<T>(T t) where T : UserControl, ITestForm, new() {}

吧?
你上面的T传一个自定义的控件,参数却是一个radiobutton?

顾晓北 | 园豆:10898 (专家六级) | 2021-06-09 11:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册