C#:将泛型类作为方法参数传递

4
我有一个名为CreateMessage类的类,它的作用是处理来自TCPClient的传入消息,获取用户类型并返回该消息应如何格式化给其调用的method
GetUserType方法中,我想要将UserBaseType作为参数传递,该参数是一个generic abstract class,需要使用UserTypeType。 但是,它报错了:

Using the generic type 'UserTypeBase' requires one type argument.

我仍然在努力理解如何使用泛型和约束条件,因此不知道是否错误地进行了操作。 我已经进行了一些探索,尝试找到适合我尝试实现的解决方案,但没有找到。
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();
}
1个回答

8

您需要将接受参数的方法也变成通用类型。您还需要将类型限制与参数化类型中的限制相对应,以避免编译错误,并明确方法中可接受和不可接受的内容。

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值。

啊,好的。那么在调用方法时,您只需通过尖括号传递参数类型吗? - Chris P. Bacon
我扩展了我的答案,也涵盖了这个问题。 - Jonathon Chase
如果你要这么做,你可能会想把它变成 private T GetUserType<T>(UserTypeBase<T> type) where T : UserType 这样你就可以得到一个强类型的函数结果。 - Scott Chamberlain
1
非常感谢,这确实帮了我很多!我觉得问一个可能很简单的问题有些傻,但它确实帮助我更好地理解了泛型的工作方式。 - Chris P. Bacon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接