gpt4 book ai didi

c# - 按属性的反射顺序

转载 作者:太空宇宙 更新时间:2023-11-03 22:43:11 24 4
gpt4 key购买 nike

我有如下契约(Contract):

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);
}
}

最后,我想找到并创建实现此接口(interface)的对象。

但是我想按顺序排序,但是下面的不行。

        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));
}

如何按顺序对消费者进行排序?

谢谢。

最佳答案

因为您只有类型(不是实例),所以没有要为 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))
{
}

或者您可以在激活器创建所有项目后按顺序对集合进行排序。

关于c# - 按属性的反射顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51264123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com