c# - 确定基类中的泛型类型
问题描述
我有以下课程。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
变量。有没有一种优雅的方式来做到这一点?
解决方案
虽然您的层次结构和泛型的使用似乎都非常可疑,但您的问题的简单答案是您执行运行时类型测试,就像您对泛型类型参数一样,就像您对其他值一样
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;
}
}
推荐阅读
- python - 如何使用flask_login库上的current_user函数使用两种用户?
- python - 读取文件并使用 python 创建多维字典
- powerbi - 填写缺失日期 Power BI
- python - 根据条件更改列的符号
- python - How to store instance of class in list?
- html - 大于屏幕的 Flexbox 高度在顶部变得不可见
- python - 从 .cmd 执行中退出代码
- javascript - 有什么方法可以使此代码更简单地用于交互式坐标平面?
- android - 如何在自定义适配器内生成的按钮中设置一些操作
- python - 拒绝在 Python 中从 Dropbox API 下载文件的权限