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

标签 c# generics

我有一个 CreateMessage 类,用于处理来自 TCPClient 的传入消息,获取用户类型并将消息的格式返回给它的调用 >方法

GetUserType 方法中,我想将 UserBaseType 作为参数传递,它是一个 generic abstract class ,它接受一个 用户类型 的类型。但是,它给了我错误:

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();
}

最佳答案

您还需要使采用通用参数的方法。您还需要反射(reflect)出现在参数类型上的类型约束以避免编译错误,并明确说明方法可接受和 Not Acceptable 内容。

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

关于C# 将泛型类作为方法参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39923197/

相关文章:

c# - 如何使用 Linq 中的通用接口(interface)类型进行过滤?

.net - 为什么 Dictionary<TKey, TValue> 没有 IEnumerable<KeyValuePair<TKey, TValue>> ctor?

c# - 使用LINQ读取XML数据,多个同名元素

c# - 多态性意外结果

c# - 如何使用 C# 中的 Youtube API 将视频上传到 YouTube?

javascript - new EventEmitter() 与 new EventEmitter<Something>()

c# - 在没有编码的 URI 模板中使用正斜杠 ('/' )

C# 将类导入为 *

C# - 错误 CS1928 : Checking for list element with derived class

swift - 用于 nil 过滤的通用 Swift 字典扩展