在c#中返回给定接口的泛型类型

Bri*_*ler 3 c# generics interface

假设我有以下设置.

Interface IDALModel {}
Run Code Online (Sandbox Code Playgroud)

各种类实现此接口,因此......

class AddressModel : IDALModel 
{
    public int AddressId {get;set;}
    public string Address {get;set;}
}

class AccountModel : IDALModel
{
    public int AccountId {get;set;}
    public string Name {get;set;}
}

class TenantModel : IDALModel
{
    public int TenantId {get;set;}
    public KeyedCollection<int, AddressModel> Addresses {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

在另一个类中,我有一个方法应该以通用方式返回类的实例.

class SomeClass
{
    internal DataFieldBuilder<IDALModel> Embed<T>(Expression<Func<T, object>> embed, string alias = "")
    {
        PropertyInfo propertyInfo = GetPropertyInfo(embed);
        Type type = propertyInfo.PropertyType.GenericTypeArguments[1];
        DataFieldBuilder<IDALModel> returnObject = new DataFieldBuilder<type>();
    }

    private PropertyInfo GetPropertyInfo<T>(Expression<Func<T, object>> field)
    {
        PropertyInfo propertyInfo;
        if (field.Body is UnaryExpression)
        {
            propertyInfo = ((MemberExpression)((UnaryExpression)field.Body).Operand).Member as PropertyInfo;
        }
        else
        {
            propertyInfo = ((MemberExpression)field.Body).Member as PropertyInfo;
        }

        return propertyInfo;
    }
}
Run Code Online (Sandbox Code Playgroud)

Embed从其他地方调用该方法

DataFieldBuilder<IDALModel> Addresses = test.Embed<TenantModel>(t => t.Addresses);
Run Code Online (Sandbox Code Playgroud)

我在embed方法中尝试做的是AddressModel从属性中提取底层类型TenantModel.Addresses并创建一个实例DataFieldBuilder<AddressModel>

这就失败了

DataFieldBuilder<IDALModel> returnObject = new DataFieldBuilder<type>();
Run Code Online (Sandbox Code Playgroud)

消息"无法将类型隐式转换DataFieldBuilder<AddressModel>DataFieldBuilder<IDALModel>

我希望,由于接口IDALModel是由AddressModel实现的,它可以工作.不知道我在这里缺少什么.

为了测试我甚至尝试过硬编码等一些例子

DataFieldBuilder<IDALModel> returnObject = new DataFieldBuilder<AddressModel>();
Run Code Online (Sandbox Code Playgroud)

这也给出了同样的错误.

Vse*_*nin 5

您可以使用通用方法定义并对其强制实施接口约束:

class SomeClass
{
    public DataFieldBuilder<T> Embed<T>() where T: IDALModel
    {
        var returnObject = new DataFieldBuilder<T>();
        return returnObject;
    }
}
Run Code Online (Sandbox Code Playgroud)