Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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#_.net_Oop_Generics_Static - Fatal编程技术网

C# 来自泛型函数的静态方法调用

C# 来自泛型函数的静态方法调用,c#,.net,oop,generics,static,C#,.net,Oop,Generics,Static,是否可以从泛型函数调用static方法 我需要这样做: public static T CreateNewProject<T, V>(string token, string projectName) where V : IProject<T> { V.LoadProject(); } 公共静态T CreateNewProject(字符串标记,字符串项目名称) 其中V:i项目 { V.LoadProject(); } 其中LoadProject()必须

是否可以从泛型函数调用
static
方法

我需要这样做:

public static T CreateNewProject<T, V>(string token, string projectName)
     where V : IProject<T>
{
   V.LoadProject();
}
公共静态T CreateNewProject(字符串标记,字符串项目名称) 其中V:i项目 { V.LoadProject(); }
其中
LoadProject()
必须是某个类的某个
静态
方法。

使用约束无法做到这一点,但可以使用
反射
。在这种情况下,它似乎是唯一的选择:

typeof(V).GetMethod("LoadProject", BindingFlags.Static | BindingFlags.Public)
         .Invoke(null);

您不能使用约束来实现这一点,但可以使用
反射
。在这种情况下,它似乎是唯一的选择:

typeof(V).GetMethod("LoadProject", BindingFlags.Static | BindingFlags.Public)
         .Invoke(null);

您可以使用单例来代替静态类:

public interface ICanLoadProject
{
    void LoadProject(string token, string projectName);
}
实施:

public class SampleProjectLoader : ICanLoadProject
{
    private static SampleProjectLoader instance = new SampleProjectLoader();

    private SampleProjectLoader(){} 

    public static SampleProjectLoader Instance { get{ return instance; } }

    public void LoadProject(string token, string projectName)
    { /*Your implementation*/ }

}
然后,泛型适用于:

where V : ICanLoadProject
在访问该方法之前,您只需执行以下操作:

SampleProjectLoader.Instance.LoadProject("token","someName");
方法可以是:

public static class ExtensionMethods
{
    public static T CreateNewProject<T, V>(this V loader, string token, string projectName) where V : ICanLoadProject
    {
        loader.LoadProject(token, projectName);
        return default(T); //no clue what you want to return here
    }
}
公共静态类扩展方法
{
公共静态T CreateNewProject(此V加载程序、字符串标记、字符串项目名称),其中V:ICanLoadProject
{
loader.LoadProject(令牌、项目名称);
返回默认值(T);//这里不知道要返回什么
}
}
将被称为:

static void Main(string[] args)
{
    object result = SampleProjectLoader.Instance.CreateNewProject<object, SampleProjectLoader>("token", "someName");
}
static void Main(字符串[]args)
{
object result=SampleProjectLoader.Instance.CreateNewProject(“token”、“someName”);
}
或者更好:

public static class ExtensionMethods
{
    public static T CreateNewProject<T>(this ICanLoadProject loader, string token, string projectName)
    {
        loader.LoadProject(token, projectName);
        return default(T); //no clue what you want to return here
    }
}
公共静态类扩展方法
{
公共静态CreateNewProject(此ICanLoadProject加载器、字符串标记、字符串项目名称)
{
loader.LoadProject(令牌、项目名称);
返回默认值(T);//这里不知道要返回什么
}
}
并致电:

SampleProjectLoader.Instance.CreateNewProject<object>("token", "someName");
SampleProjectLoader.Instance.CreateNewProject(“token”、“someName”);

您可以做的是使用单例而不是使用静态类:

public interface ICanLoadProject
{
    void LoadProject(string token, string projectName);
}
实施:

public class SampleProjectLoader : ICanLoadProject
{
    private static SampleProjectLoader instance = new SampleProjectLoader();

    private SampleProjectLoader(){} 

    public static SampleProjectLoader Instance { get{ return instance; } }

    public void LoadProject(string token, string projectName)
    { /*Your implementation*/ }

}
然后,泛型适用于:

where V : ICanLoadProject
在访问该方法之前,您只需执行以下操作:

SampleProjectLoader.Instance.LoadProject("token","someName");
方法可以是:

public static class ExtensionMethods
{
    public static T CreateNewProject<T, V>(this V loader, string token, string projectName) where V : ICanLoadProject
    {
        loader.LoadProject(token, projectName);
        return default(T); //no clue what you want to return here
    }
}
公共静态类扩展方法
{
公共静态T CreateNewProject(此V加载程序、字符串标记、字符串项目名称),其中V:ICanLoadProject
{
loader.LoadProject(令牌、项目名称);
返回默认值(T);//这里不知道要返回什么
}
}
将被称为:

static void Main(string[] args)
{
    object result = SampleProjectLoader.Instance.CreateNewProject<object, SampleProjectLoader>("token", "someName");
}
static void Main(字符串[]args)
{
object result=SampleProjectLoader.Instance.CreateNewProject(“token”、“someName”);
}
或者更好:

public static class ExtensionMethods
{
    public static T CreateNewProject<T>(this ICanLoadProject loader, string token, string projectName)
    {
        loader.LoadProject(token, projectName);
        return default(T); //no clue what you want to return here
    }
}
公共静态类扩展方法
{
公共静态CreateNewProject(此ICanLoadProject加载器、字符串标记、字符串项目名称)
{
loader.LoadProject(令牌、项目名称);
返回默认值(T);//这里不知道要返回什么
}
}
并致电:

SampleProjectLoader.Instance.CreateNewProject<object>("token", "someName");
SampleProjectLoader.Instance.CreateNewProject(“token”、“someName”);


不,您不能:-)遗憾的是,接口不能定义必须存在的静态方法/构造函数。请参阅@xanatos,那么如何调用静态方法?我可以用一些东西来代替界面吗?(请原谅我以重复的形式结束…,虽然我确实认为它是重复的(甚至Selman22提出的解决方案也在其他问题中提出),但我不知道我有直接结束的超级能力,而不需要其他四个人来检查它)@xanatos没问题:)不,您不能:-)遗憾的是,接口不能定义必须存在的静态方法/构造函数。请参阅@xanatos,那么如何调用静态方法?我可以用一些东西来代替界面吗?(请原谅我以重复的形式结束…虽然我确实认为它是重复的(甚至塞尔曼22提出的解决方案也在其他问题中提出),但我不知道我有直接结束的超级能力,而不需要其他四个人的审查)@xanatos没问题:)但请清楚地记住,通过使用反射,您放弃了编译时检查,但请清楚地记住,通过使用反射,您放弃了编译时检查非常有趣的解决方案,但我希望避免将附加参数“ICanLoadProject loader”传递给“CreateNewProject”函数。有可能吗?如果您使用扩展方法,您不会。。。。你只要像我一样在实例中调用它。。。。这将获取您从中调用它的实例的值。。。唯一的缺点是它必须是一个静态类,在该类中实现该方法。。。你看我写的代码…我理解正确了吗,我必须传递“thisv”或“thisproject”作为参数?我无法避免这种情况?实际上,您可以创建另一个静态方法,将对LoadProject的methodcall委托给ProjectLoader类中的instance.LoadProject。。。它只需要有一个不同的名字…不,我给了你如何称呼它的例子。。。使用最后2个实现。。。然后,您只有一个泛型类型来编写每个有趣的解决方案,但我希望避免将额外的参数“ICanLoadProject loader”传递给“CreateNewProject”函数。有可能吗?如果您使用扩展方法,您不会。。。。你只要像我一样在实例中调用它。。。。这将获取您从中调用它的实例的值。。。唯一的缺点是它必须是一个静态类,在该类中实现该方法。。。你看我写的代码…我理解正确了吗,我必须传递“thisv”或“thisproject”作为参数?我无法避免这种情况?实际上,您可以创建另一个静态方法,将对LoadProject的methodcall委托给ProjectLoader类中的instance.LoadProject。。。它只需要有一个不同的名字…不,我给了你如何称呼它的例子。。。使用最后2个实现。。。那么您只需要编写一个泛型类型