1

这是我试图理解的一段 C# 代码。类在接口中具有以下可用方法。

T GetLookupValue<T, S>(string sTName, string sFName, string sLuName, S value);

当我使用 dotPeek 查看这个类的用法时,它显示了这一点。

 public T GetLookupValue<T, S>(string sTName, string sFName, string sLuName, S value)
{
  return (T) this.db.a(sTName, sFName, sLuName, false, (object) value, false, false);
}

我如何调用这个方法?我需要用什么代替 T 和 S?

4

5 回答 5

2

该方法将自身呈现为通用查找函数。如果实现真的可以处理任何类型,那么您可以对 S 和 T 使用任何类型。

例子:

string result = GetLookupValue<string, int>("tname", "fname", "luname", 42);

MyClass result = GetLookupValue<MyClass, string>("tname", "fname", "luname", "blah");
于 2012-08-15T17:33:31.203 回答
1

这是对 C# 泛型的精彩介绍,这就是它。

基本上,您只需将 T 和 S 替换为您想要的任何内容。T 是您的返回类型,S 将是用于最终参数的类型 ( value)

例如:

var myObject = GetLookupValue<MyObject, MyOtherObject>("sTName", "sFName", "sLuName", (MyOtherObject)myOtherObject);

这允许更健壮的代码。您可以将一种方法塑造成您需要的任何东西

泛型是您如何将任何内容放入List<T>

List<String> stringList = new List<String>();
List<int> intList = new List<int>();
...

在编译时,您的泛型值被内置到您的代码中。所以,如果你对我上面的例子做了一个 dotPeek,你会看到这样的东西:

public MyObject GetLookupValue<MyObject, MyOtherObject>(string sTName, string sFName, string sLuName, MyOtherObject value)
{
  return (MyObject) this.db.a(sTName, sFName, sLuName, false, (object) value, false, false);
}

***但是,在写出来时,将参数value作为泛型似乎毫无意义,因为它只是被强制转换为object.... 他们可能已经成功了T GetLookupValue<T>(string sTName, string sFName, string sLuName, object value);。(它允许最终装箱一个值对象(即 int、double 等)

于 2012-08-15T17:33:43.180 回答
1

我如何调用这个方法?

这将取决于您要使用的类型。例如:

int result = GetLookupValue<int, string>("tname", "fname", "luname", "some value");
于 2012-08-15T17:33:46.533 回答
1

类型 T 和 S 是类型。要调用此方法并存储结果,请使用:

SomeClass returnedObject = GetLookupValue<SomeClass, SomeOtherType>("", "", "", "");

该方法将返回与您为 T 输入的任何内容等效的类型。

于 2012-08-15T17:34:52.550 回答
1

看来 T 是您的返回类型,而 S 是在内部用作某个值的类型。

因此,您需要为 T 和 S 指定类型,因此:

SomeType result = GetLookupValue<SomeType, SomeValueType>(...);
于 2012-08-15T17:36:16.303 回答