簡體   English   中英

泛型函數的靜態方法調用

[英]Static method call from generic function

是否可以從泛型函數調用static方法?

我需要做這樣的事情:

public static T CreateNewProject<T, V>(string token, string projectName)
     where V : IProject<T>
{
   V.LoadProject();
}

其中LoadProject()必須是某個類的某些static方法。

您不能使用約束來做到這一點,但是可以使用Reflection 在這種情況下,它似乎是唯一的選擇:

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
    }
}

並且將被稱為:

static void Main(string[] args)
{
    object result = SampleProjectLoader.Instance.CreateNewProject<object, SampleProjectLoader>("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
    }
}

並致電:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM