使用泛型参数创建方法

时间:2017-07-06 06:33:26

标签: generics c#-4.0 generic-programming

我正在尝试在如下的静态类中创建泛型方法 我将在运行时传递paramData。

doc.xpath(
    '//ns:jdbc-data-source/ns:jdbc-driver-params/ns:url',
    namespaces={
        'ns':'http://xmlns.oracle.com/weblogic/jdbc-data-source'
    }
 )

这是有效的,但只要我按照下面的方法名称删除[<Element {http://xmlns.oracle.com/weblogic/jdbc-data-source}url at 0x1049877a0>] ,它就会开始显示 类型错误。为什么会这样。

 public static void InsertBulk<T>(string procedure, IDictionary<T,T> paramData)

    {
        //Body
    }

据我所知,我可以使用<T>调用此方法 所以,为什么要求方法名称。有什么用。

1 个答案:

答案 0 :(得分:2)

这里有两个独立的事情要理解:

  • 如何声明通用方法
  • 如何调用通用方法

您需要在方法声明中包含<T>,以使其成为通用方法。没有它,编译器不知道T是什么......它期望它是常规类型的名称。

现在当你调用泛型方法时,可以像这样指定类型参数:

InsertBulk<int>("MyProc", myParams);

这里只有一个类型参数:int。 (由于下面描述的原因,这不会编译,但它是指定类型参数的一个示例。)

...或者您可以让编译器根据方法的参数尝试推断类型参数 - 在这种情况下,它会查看myParams并找出什么type参数必须是使调用编译。类型推断的细节非常复杂,但它们的设计使得在合理的情况下,您可以在不指定类型参数的情况下离开。

在您的情况下,由于myParamsIDictionary<int, string>,因此无论如何都无法编译,因为没有T IDictionary<int, string>IDictionary<T, T> 。您可能会使您的方法改为两个类型参数:

public static void InsertBulk<TKey, TValue>(
    string procedure, IDictionary<TKey, TValue> paramData)

这一点你可以调用InsertBulk("MyProc", myParams),编译器会推断出intstring的类型参数。