C#将通用类作为方法参数传递

时间:2016-10-07 17:51:18

标签: c# generics

我有CreateMessage class用于处理来自TCPClient的传入消息,获取用户类型并返回消息应如何格式化为其调用method

在方法GetUserType中,我想传递UserBaseType作为参数,generic abstract class需要Type 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();
}

1 个答案:

答案 0 :(得分:5)

您将要制作使参数通用的方法。您还希望镜像类型约束,因为它们出现在参数类型上以避免编译错误,并且明确了该方法的可接受性和不可接受性。

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的预期值。