首页 > 解决方案 > 确定基类中的泛型类型

问题描述

我有以下课程。AuthorTest并且BookTest都继承自MyBaseClass,它有一个AddName接受通用参数的方法。

public class Book {
    public string Name {get;set;}
}

public class Author {
    public string FirstName {get;set;}
    public string LastName {get;set;}
}

public class BookTest : MyBaseClass {
    Book book = // book object

    base.AddName<Book>(book);
}

public class AuthorTest : MyBaseClass {
    Author author = // author object

    base.AddName<Author>(author);
}

public interface IMyBaseClass {
    void AddName<T>(T item);
}

public class MyBaseClass : IMyBaseClass {
    public void AddName<T>(T item) {
        // item could either be Book or Name
        var name = item.Name

        // or

        var name = item.FirstName + " " item.LastName;
    }
}

在基类中,如何确定T传入的是哪种类型(书籍或作者)?基于此,我需要构造name变量。有没有一种优雅的方式来做到这一点?

标签: c#generics

解决方案


虽然您的层次结构和泛型的使用似乎都非常可疑,但您的问题的简单答案是您执行运行时类型测试,就像您对泛型类型参数一样,就像您对其他值一样

public class MyBaseClass : IMyBaseClass
{
    public void AddName<T>(T item)
    {
        // item could either be Book or Author
        var name = item switch
        {
            Author a => $"{a.FirstName} {a.LastName}",
            Book b => b.Name,
            _ => throw new ArgumentException(nameof(item), $"Invalid type: {a?.GetType()}")
        };
    }
}

然而,正如其他人已经指出的那样,由于您只支持一组固定的类型,因此重载会更合适。

public class MyBaseClass : IMyBaseClass
{
    public void AddName(Author author)
    {
        var name = $"{author.FirstName} {author.LastName}";
    }
    public void AddName(Book book) {
        var name = book.Name;
    }
}

推荐阅读