Я бы сказал, что фактическое имя вашего класса ConcreteComponent1 не является "MyCompany.Components.ConcreteComponent1", потому что оно содержит универсальный. Выполнить
Console.WriteLine(typeof(ConcreteComponent1<T>).FullName);
чтобы увидеть строковое представление для вашего класса, созданное C #.
Но почему вы определяете ваш класс ConcreteComponent1 так, как вы это делаете? Не лучше ли использовать что-то вроде этого:
public class ConcreteComponent1 : IComponent<Contact> {
internal ConcreteComponent1() {}
public void PerformTask(object executionContext)
{
this.contactSource = GetSource(executionContext);
foreach(var result in this.contactSource)
{
result.Execute(executionContext);
}
}
public IEnumerable<Contact> DataSource
{
get { return this.contactSource; }
set { this.contactSource = value; }
}
}
Таким образом, вы можете использовать ожидаемое имя, которое вы уже использовали в своем примере, и вы можете удалить дополнительное личное поле, которое вводит ваш подход. Поскольку ваш класс ConcreteComponent1 на самом деле не нуждается в какой-либо общей функциональности, на мой взгляд, это был бы лучший подход.