estoy creando instancias de un tipo genérico utilizando la reflexión:fundición casos de tipo genérico creado usando Reflexión
public interface IModelBuilder<TModel>
{
TModel BuildModel();
}
public class MyModel
{
public string Name { get; set; }
}
public class MyModelBuilder : IModelBuilder<MyModel>
{
public MyModel BuildModel()
{
throw new NotImplementedException();
}
}
En tiempo de ejecución de todo lo que sabemos es el tipo de modelo, por ejemplo, MyModel
. No puedo encontrar las instancias del constructor de modelos relevantes de este modo:
var modelBuilders = from t in Assembly.GetExecutingAssembly().GetTypes()
from i in t.GetInterfaces()
where i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(IModelBuilder<>)
&& i.GetGenericArguments()[0] == modelType
select t;
var builder = Activator.CreateInstance(modelBuilders.First());
Pero no estoy seguro de cómo puedo entonces emitir el ejemplo como IModelBuilder<TModel>
para que pueda llamar y trabajar con el resultado de BuildModel()
.
Tenía la sensación de que este sería el caso. Creo que la opción 2 funcionará mejor para mí, ya que necesito trabajar con propiedades en el modelo que se creó. –
@Ben si necesita hacer una cantidad de trabajo no trivial, puede * también * hacer esto con un método genérico, que * invoque mediante reflejo *, es decir, en el método genérico de '' es 'IModelBuilder '. ¿Quieres un ejemplo de eso? –
¡agradable! Y muy furtivo :) –