作者:枝玫焰 | 来源:互联网 | 2023-05-28 10:36
假设我有以下设置.
Interface IDALModel {}
各种类实现此接口,因此......
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 Addresses {get;set;}
}
在另一个类中,我有一个方法应该以通用方式返回类的实例.
class SomeClass
{
internal DataFieldBuilder Embed(Expression> embed, string alias = "")
{
PropertyInfo propertyInfo = GetPropertyInfo(embed);
Type type = propertyInfo.PropertyType.GenericTypeArguments[1];
DataFieldBuilder returnObject = new DataFieldBuilder();
}
private PropertyInfo GetPropertyInfo(Expression> 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;
}
}
Embed
从其他地方调用该方法
DataFieldBuilder Addresses = test.Embed(t => t.Addresses);
我在embed方法中尝试做的是AddressModel
从属性中提取底层类型TenantModel.Addresses
并创建一个实例DataFieldBuilder
这就失败了
DataFieldBuilder returnObject = new DataFieldBuilder();
消息"无法将类型隐式转换DataFieldBuilder
为DataFieldBuilder
我希望,由于接口IDALModel是由AddressModel实现的,它可以工作.不知道我在这里缺少什么.
为了测试我甚至尝试过硬编码等一些例子
DataFieldBuilder returnObject = new DataFieldBuilder();
这也给出了同样的错误.
1> Vsevolod Gol..:
您可以使用通用方法定义并对其强制实施接口约束:
class SomeClass
{
public DataFieldBuilder Embed() where T: IDALModel
{
var returnObject = new DataFieldBuilder();
return returnObject;
}
}