Вот ситуация:
Я пытаюсь получить коллекцию всех типов в моей сборке, которые реализуют определенный универсальный интерфейс вместе с используемыми параметрами универсального типа. Мне удалось собрать запрос Linq для выполнения этого, но он выглядит ужасно избыточным.
Я перечитал let и объединения, но не мог понять, как их использовать, чтобы уменьшить многословность этого конкретного запроса. Кто-нибудь может дать какие-нибудь советы о том, как сократить / улучшить запрос, пожалуйста?
Вот класс MSTest, который в настоящее время проходит и демонстрирует, чего я пытаюсь достичь:
[TestClass]
public class Sample
{
[TestMethod]
public void MyTest()
{
var results =
(from type in Assembly.GetExecutingAssembly().GetTypes()
where type.GetInterfaces().Any(x =>
x.IsGenericType &&
x.GetGenericTypeDefinition() == typeof(MyInterface<,>)
)
select new ResultObj(type,
type.GetInterfaces().First(x =>
x.IsGenericType &&
x.GetGenericTypeDefinition() == typeof(MyInterface<,>)
).GetGenericArguments()[0],
type.GetInterfaces().First(x =>
x.IsGenericType &&
x.GetGenericTypeDefinition() == typeof(MyInterface<,>)
).GetGenericArguments()[1]
)).ToList();
Assert.AreEqual(1, results.Count);
Assert.AreEqual(typeof(int), results[0].ArgA);
Assert.AreEqual(typeof(string), results[0].ArgB);
}
interface MyInterface<Ta, Tb>
{ }
class MyClassA : MyInterface<int, string>
{ }
class ResultObj
{
public Type Type { get; set; }
public Type ArgA { get; set; }
public Type ArgB { get; set; }
public ResultObj(Type type, Type argA, Type argB)
{
Type = type;
ArgA = argA;
ArgB = argB;
}
}
}
С уважением,
Мэтт