Return 来自泛型方法的派生对象

Return a derived object from a generic method

我想创建一个方法,可以return定义在class中的泛型类型,这里有一个详细的例子;

https://dotnetfiddle.net/SApVp3

using System;
                    
public class Program
{
    public static void Main()
    {
        // This would be some string imported from a CSV file   
        var customerData = "Customer,1,Ford";       
        var personData = "Person,675,Henry,Ford";
        
        var customerImporter = new ImportData<CompanyMaster>();
        customerImporter.ImportDataFromFile(customerData);
                                      
        var personImporter = new ImportData<PersonMaster>();
        personImporter.ImportDataFromFile(personData);
    }
}

public class GenericRepository<TBase> 
    where TBase : EntityBase
{
    public void Insert(TBase entity)
    {
        //.. generic Insert to database
    }
}

public class ImportData<TBase>  
    where TBase : EntityBase
{
    GenericRepository<TBase> _genericRepository;
    
    //ctor
    public void ImportDataFromFile(string data)
    {
        // convert the string data to TBase
        _genericRepository = new GenericRepository<TBase>();
    }
}

public class CsvConverter<TBase> where TBase: EntityBase{
    
    public TBase ConvertTo(string someString)
    {
        if (someString.StartsWith("Customer"))
        {
            return GetCompany(someString);
        } 
        
        else return GetPerson(someString);
    }
    
    private CompanyMaster GetCompany(string companyString){
        return new CompanyMaster();
    }
    
    private PersonMaster GetPerson(string companyString){
        return new PersonMaster();
    }

}


public abstract class EntityBase
{
    public int Id { get; set; }
    public DateTime CreatedDate { get; set; }
}

public class CompanyMaster : EntityBase
{
    public string CompanyName { get; set; }
}

public class PersonMaster : EntityBase
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

当前抛出;

Compilation error (line 47, col 11): Cannot implicitly convert type 'CompanyMaster' to 'TBase' Compilation error (line 50, col 15): Cannot implicitly convert type 'PersonMaster' to 'TBase'

这可以工作吗?

您需要使用以下方法进行向上转换:

public TBase ConvertTo(string someString)
{
  if ( someString.StartsWith("Customer") )
  {
    return (TBase)Convert.ChangeType(GetCompany(someString), typeof(TBase));
  }
  else
  {
    return (TBase)Convert.ChangeType(GetPerson(someString), typeof(TBase));
  }
}

或者按照@canton7 的建议:

if ( someString.StartsWith("Customer") )
{
  return (TBase)(object)GetCompany(someString);
}
else
{
  return (TBase)(object)GetPerson(someString);
}

Difference between casting and using the Convert.To() method