簡體   English   中英

C#將泛型類作為方法參數傳遞

[英]C# Passing a Generic Class As a Method Parameter

我有一個CreateMessage classCreateMessage class用於處理來自TCPClient傳入消息,獲取用戶類型並返回如何將消息格式化為其調用method

在方法GetUserType ,我想將UserBaseType作為參數傳遞,這是一個generic abstract class ,它采用Type of UserType 但是,它給了我錯誤:

使用通用類型'UserTypeBase'需要一個類型參數。

我仍在嘗試使用泛型和約束來解決問題,所以我不知道我是否會以錯誤的方式進行操作。 我已經做了一些挖掘工作以嘗試自己找到解決方案,但是還沒有找到或多或少適合我要嘗試做的事情的東西。

internal class CreateMessage
{
    internal static string user;
    internal static string message;

    internal CreateMessage(string data)
    {
        user = Lists.users[data.Substring(1, 3)];
        message = data.Substring(5, data.Length - 5);
    }

    private UserType GetUserType(UserTypeBase type)
    {
        return type.CreateType();
    }

    internal string Message()
    {
        UserType Type = null;
        if (user.Contains("[M]"))
            Type = GetUserType(UserMod);
        else if (user.Contains("[B]"))
            Type = GetUserType(UserVIP);
        else
            Type = GetUserType(UserRegular);
        return Type.Message();
    }
}

UserBaseType.cs

internal abstract class UserTypeBase<T> where T: UserType
{
    public abstract string User { get; }
    public abstract string Message { get; }
    public abstract T CreateType();
}

您將要使采用參數通用的方法。 您還將要鏡像出現在參數類型上的類型約束,以避免編譯錯誤,並明確說明該方法可接受和不可接受的范圍。

private T GetUserType<T>(UserTypeBase<T> type) where T : UserType
{
    return type.CreateType();
}

然后可以根據情況使用顯式或隱式提供的類型進行調用。

var someType = new UserTypeDerived<UserType>();
var resultImplicit = GetUserType(someType);
var resultExplicit = GetUserType<UserType>(someType);

由於它是一般使用的參數,因此編譯器可以根據所提供的參數的類型隱式確定T的期望值。

暫無
暫無

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

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