是否可以通過泛型函數調用static
方法?來自通用函數的靜態方法調用
我需要做這樣的事情:
public static T CreateNewProject<T, V>(string token, string projectName)
where V : IProject<T>
{
V.LoadProject();
}
其中LoadProject()
必須是某些類的static
方法。
是否可以通過泛型函數調用static
方法?來自通用函數的靜態方法調用
我需要做這樣的事情:
public static T CreateNewProject<T, V>(string token, string projectName)
where V : IProject<T>
{
V.LoadProject();
}
其中LoadProject()
必須是某些類的static
方法。
你可以做的是,而不是使用靜態類是使用單:
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");
非常有趣的解決方案,但我想避免傳遞一個額外的參數「ICanLoadProject loader」到「 CreateNewProject「功能。可能嗎? – Ilan 2015-02-24 12:53:26
如果你使用的ExtensionMethod你不....你只是把它稱爲像我這樣的實例....這將得到你稱它的實例的價值...唯一的缺點是,它必須是一個靜態類,其中的方法實施...你看到我寫的代碼... – 2015-02-24 12:58:06
它是'這個'關鍵字之前的類型和名稱... – 2015-02-24 12:59:45
你不能用約束來做到這一點,但你可以使用Reflection
。它看起來像在這種情況下,唯一的選擇:
typeof(V).GetMethod("LoadProject", BindingFlags.Static | BindingFlags.Public)
.Invoke(null);
但清楚地記得,通過使用反射,你正在放棄編譯時檢查 – xanatos 2015-02-24 11:28:50
不,你不能:-)可悲的是接口不能定義什麼靜態方法/構造函數必須存在。 – xanatos 2015-02-24 11:17:04
並參見http://stackoverflow.com/questions/196661/calling-a-static-method-on-a-generic-type-parameter – xanatos 2015-02-24 11:18:55
@xanatos那麼我怎樣才能打電話給靜態方法?我可以使用某些東西而不是界面嗎? – Ilan 2015-02-24 11:19:44