簡體   English   中英

C#如何將類作為參數傳遞給方法並確定參數類的基類

[英]C# how to pass a class as a parameter into a method and determining the base class of the parameter class

所以我一直在通過在列表的add方法中調用構造函數來將類添加到類列表中:

SupportedTests.Add(new SpecificTestClass27());

但是,我正在使用的類是派生類(大多數情況下,它們具有4或5個基類鏈),我只想根據它們使用的基類將它們添加到列表中(而不是直接基類)課,但有幾個基礎課)

鏈接基類的示例:

public class SpecificTestClass27 : SpecificTestClass27_base

public abstract class SpecificTestClass27_base: OperationTestClass_base

public abstract class OperationTestClass_base: DomesticTestClass

要么

public abstract class OperationTestClass_base: InternationalTestClass

DomesticTestClasInternationalTestClass都源自相同的基類: TestClass ,而這兩個基類之上的不同類不一定相同,包括頂級類。

我無法更改任何代碼,但是我需要一種方法,該方法將最終從DomesticTestClassInternationalTestClass派生的特定類傳遞給方法,然后決定是否將特定類添加到列表中,具體取決於它具有的基類。

我試過只是一個普通的方法:

public void AddaTestClass(object SpecificTestClass)
{
    if (base == DomesticTestClass) { SupportedTests.Add(new SpecificTestClass()); }
}

但是它不喜歡參數是一個類。 當我嘗試使用帶有重載的泛型時:

public void AddaTestClass<<"SpecificTestClass">>() where SpecificTestClass : DomesticTestClass
{
    SupportedTests.Add(new SpecificTestClass());
}

public void AddaTestClass<<"SpecificTestClass">>() where SpecificTestClass : InternationalTestClass
{

}

注意:我的程序中沒有引號中的SpecificTestClass ,只是在克拉之間沒有引號就不會顯示

這不允許我調用該類的構造函數,因為它沒有new()約束,並且在沒有重載的情況下仍然失敗。

還有另一種方法可以做到嗎?

由於您正在創建一個新類以將其添加到集合中,因此需要將一個new約束添加到通用類型參數中,以告訴編譯器有一個保證的公共無參數構造函數。

public void AddADomesticTestClass<T>() where T: DomesticTestClass, new()
{
    SupportedTests.Add(new T());
}

public void AddAnInternationalTestClass<T>() where T: InternationalTestClass, new()
{
    SupportedTests.Add(new T());
}

或者

public void AddATestClass<T>() where T: TestClass, new()
{
    if (typeof(T).IsAssignableFrom(typeof(DomesticTestClass))
        || typeof(T).IsAssignableFrom(typeof(InternationalTestClass)))
    {
        SupportedTests.Add(new T());
    }
}

暫無
暫無

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

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