初学泛型,请教各位大侠,
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,而其后面()中写入的是一个实际的类型,百度了一下,一些文章中说是重载用了这种写法,但是没搞懂这样写是否符合泛型方法声明,或是泛型方法到底可以如何声明,以及调用,
请大侠指点迷津,支出知识点的源头,我可以进一步学习,谢谢
这是什么问题,泛型方法唯一必须的东西就是泛型参数,就是尖括号里面的类型,其他的地方可以随便写的。
你可以写一个泛型的无参方法
void Method<T>()
{
}
也可以写泛型的有参函数
void Method<T>(T t1)
{
}
void Method<T>(int value)
{
}
参数的类型和泛型方法的类型参数之间没有必然联系
是否可以这样理解,您说的
void Method<T>(T t1)
{
}
接受一个泛型参数,该泛型方法在实际使用时,指定泛型参数的类型,可以是int,可以是string或是其他,比如调用时可以使用method<int>(3);
而void Method<T>(int value)
{
}
是适用于int参数的专用版本,在调用时,只能是method<int>(3)
还请大侠多讲几句,先谢过了!
@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
}
···
这样可以理解吗
@拓拓: 受教,受教,谢谢
理论上,他那个方法的定义应该是:
private CreateInstance<T>(T t) where T : UserControl, ITestForm, new() {}
吧?
你上面的T传一个自定义的控件,参数却是一个radiobutton?