具有意外行为的通用方法参数

时间:2018-03-29 09:13:26

标签: c# visual-studio

我目前遇到泛型方法的问题。 首先,我有一个抽象类,其中包含这个抽象的泛型方法:

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信息,另一个文档需要一些不同的类型。

3 个答案:

答案 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();
        }
    }
}