从泛型方法返回派生对象

时间:2021-01-15 13:51:09

标签: c# generics casting instantiation upcasting

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

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

当前抛出;

<块引用>

编译错误(第 47 行,第 11 栏):无法将类型“CompanyMaster”隐式转换为“TBase” 编译错误(第 50 行,第 15 行):无法将类型“PersonMaster”隐式转换为“TBase”

这能起作用吗?

1 个答案:

答案 0 :(得分:1)

你需要使用:

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

相关问题