我目前遇到泛型方法的问题。 首先,我有一个抽象类,其中包含这个抽象的泛型方法:
abstract protected void myMethod<T> (List<T> myList);
然后,在实现该方法时,我使用DateTime
作为列表的类型:
protected override void myMethod<DateTime>(List<DateTime> myList)
到目前为止,一切似乎都没问题。然后,我发现意外的行为是我无法访问列表项的任何DateTime方法:
String date = ((DateTime)myList[0]).ToString("dd-MM-yyyy");
方法'ToString'没有重载需要1个参数
所以这就是问题所在,无论我正在尝试什么演员,我都无法解决错误。 我应该提一下,我刚刚开始使用C#,所以也许我还没有理解泛型类型应该如何运作。
L.E。 所以我正在尝试做的是从C#创建并完成一些word文档。 我的父类抽象类将有2个方法,createDocument和completeDocument。 createDocument不依赖于文档,因为创建过程将始终相同。所以,我在父类中实现了它。然后,completeDocument方法将取决于我想要完成的文档,因为我将使用不同类型的信息,这些信息将添加到文档的不同区域。 上面的myMethod是我试图用completeDocument实现的简化版本。
所以,现在我有2种不同的文档类型,这意味着基类继承了两次。一个文档需要DateTime信息,另一个文档需要一些不同的类型。
答案 0 :(得分:3)
方法的通用参数应在调用方法时提供,而不是在重写时。
您必须将通用参数添加到类中,然后在子类中指定具体类型
public abstract class A<T>
{
abstract protected void myMethod(List<T> myList);
}
public class B : A<DateTime>
{
protected override void myMethod(List<DateTime> myList)
{
var date = myList[0].ToString("dd-MM-yyyy");
}
}
注意的
如果您可以在覆盖方法时指定特定的类型
public abstract class A
{
abstract protected void myMethod<T>(List<T> myList);
}
public class B : A
{
protected override void myMethod<DateTime>(List<DateTime> myList)
{
}
}
然后是代码
A a = new B();
a.myMethod(new List<string>());
不一致,您将List<strign>
传递给方法,实际上它期望List<DateTime>
。
实际上
protected override void myMethod<DateTime>(List<DateTime> myList)
只需将T
的新名称指定为DateTime
。
答案 1 :(得分:1)
您声明中的protected override void myMethod<DateTime>(List<DateTime> myList)
DateTime
是 NOT T
类,而是一个通用的类标识符。在大多数情况下,我们想称之为DateTime
(它不必,任何名称都可以接受)。如果您希望自己的方法只处理T
,则根本不必使用通用类 protected override void myMethod<T>(List<T> myList)
{
if (typeof(T) == typeof(DateTime))
{
//this is a List<DateTime>
var list = (IList<DateTime>)myList;
String str = list[0].ToString("yyyy");
}
else if(typeof(T) == typeof(String))
{
//this is a List<String>
}
else
{
//.....Other classes
}
}
void test()
{
myMethod<String>(new List<String>());//this will access the "else if" part
}
。
或者,如果您确实希望允许它将多个类作为输入进行处理。您可以重载方法。或者,除非确实有必要,否则请执行以下操作以确定具体的类:
result[0][0]
答案 2 :(得分:-1)
namespace GenericMethodParameter
{
abstract class TestClass
{
abstract protected void myMethod<T>(List<T> myList);
}
class Program:TestClass
{
static void Main(string[] args)
{
Program program=new Program();
program.myMethod<DateTime>(new List<DateTime>(){DateTime.Now});
Console.ReadKey();
}
protected override void myMethod<T>(List<T> myList)
{
string dateTime = ((DateTime)(object)myList[0]).ToString("dd-MM-yyyy");
Console.WriteLine(dateTime);
//throw new NotImplementedException();
}
}
}