Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将当前类/对象的类型传递给C#程序中没有显式类型引用的泛型方法?_C#_Generics_Types - Fatal编程技术网

将当前类/对象的类型传递给C#程序中没有显式类型引用的泛型方法?

将当前类/对象的类型传递给C#程序中没有显式类型引用的泛型方法?,c#,generics,types,C#,Generics,Types,在调用泛型方法时,是否可以使用当前类/对象类型的简写,而不必显式传递当前类/对象的名称 例如,给定以下示例代码: public class SomeClass { public SomeClass() { // Call some generic method that returns a string. string s = GenMeth<SomeClass>)(); } } // public class SomeClas

在调用泛型方法时,是否可以使用当前类/对象类型的简写,而不必显式传递当前类/对象的名称

例如,给定以下示例代码:

public class SomeClass
{
    public SomeClass()
    {
        // Call some generic method that returns a string.
        string s = GenMeth<SomeClass>)();
    }
} // public class SomeClass
公共类SomeClass
{
公共类()
{
//调用一些返回字符串的泛型方法。
字符串s=GenMeth();
}
}//公共类SomeClass
有没有办法告诉C#我想将当前类(SomeClass)的类传递给GenMeth(),而不必显式地说SomeClass

一个假设和虚假的例子说明了这一概念:

string s = GenMeth<GetType(this)>();
string s=GenMeth();

不,没有这样的语法


理论上,您可以通过反射调用该方法,从而允许您使用
this.GetType()
,但这会让情况变得越来越糟。只是…别那么做。如果复制/粘贴代码,只需记住将泛型参数更改为当前类型就容易多了。

如果让方法使用该类型的实例,它可以推断它。例如,如果您的方法如下所示:

void GenMeth<T>(T instance) {}

这是否会被你接受可能是另一回事。(如果你从来没有使用过参数,那就有点奇怪了)

你可以创建一个扩展方法来执行你对任何对象的任何操作。您可以使用
GetType()
在扩展方法中检查合法的类型


如果您最终确实这样做了,请将其作为可选重载提供,而不是唯一的重载,这样您就可以在没有希望泛型参数为的类型的实例时使用它。@Servy,当然可以。老实说,我看不出自己在使用这个解决方案,但认为它值得一提。我看不出这与这个问题有什么关系。@mbeckish这个问题有点太不同了,在我看来不可能是重复的。另外,请记住,当前类的类型可能与当前对象的类型不同。如果该类是子类
,则此.GetType()
可能返回与当前类不同的类型。@jam40jeff从构造函数调用时不是这样;)已经晚了,我可能遗漏了一些东西,但是正在执行的构造函数不能是来自子类的基构造函数调用吗?在这种情况下,代码将在超类中执行,但是
this.GetType()
将返回子类,对吗?@jam40jeff-Oh,你是对的,不管我说什么。它需要采用静态方法。
GenMeth(this);
public static class ObjectExtensions {

  public static string GenMeth(this object obj) {
    // do stuff here and return string type
  }
}