我的合同如下:
private myFunction(myModel: BaseModel) {
// Do smthg
}
let johnDoe = new SomeModel();
myFunction(johnDoe);
然后,我有了实现此联系人的消费者。
其中一位消费者是:
public interface IConsumer<in T>
{
void Handle(T eventMessage);
int Order { get; }
}
最后,我想找到并创建实现此接口的对象。
但是我想按顺序对它进行排序,但是以下方法不起作用。
public class TransferReceiverSmsConsumer : IConsumer<Event<Transfer>>
{
public int Order => 1;
public void Handle(Event<Transfer> eventMessage)
{
var representation = $"{eventMessage.Entity.Sender} transferred {eventMessage.Entity.Amount} TL. to {eventMessage.Entity.Receiver} on {eventMessage.Entity.Now}.";
Console.WriteLine("SMS:" + representation);
}
}
如何按 var iconsumer = typeof(IConsumer<T>);
var types = AppDomain.CurrentDomain.GetAssemblies().SelectMany(s => s.GetTypes())
.Where(p => iconsumer.IsAssignableFrom(p) && p.IsClass);
var consumers = new List<IConsumer<T>>();
foreach (var type in types.OrderBy(r => r.GetProperty("Order")))
{
consumers.Add((IConsumer<T>) Activator.CreateInstance(type));
}
对消费者进行排序?
谢谢。
答案 0 :(得分:2)
由于只有类型(没有实例),因此Order
没有要获取的值。我建议您将一个自定义属性添加到名为Order的实现类中,并按此排序。 (您可以将其从界面中删除)
public class Order : Attribute
{
public Order(int value)
{
Value = value
}
public int Value{ get; }
}
[Order(1)]
public MyClass<T> : IConsumer<T>
{
}
foreach (var type in types.OrderBy(r =>
r.GetCustomAttributes(true).OfType<Order>().FirstOrDefault().Value))
{
}
或者您可以在激活器创建完所有项目之后按Order
对集合进行排序。
答案 1 :(得分:1)
我建议使用为实现合同的每个类放置的自定义属性。该自定义属性应具有Order属性。否则,您需要使用反射来获取实现您的接口的所有最终类型以及这些类型的所有实例。