Я не уверен, что именно вы пытаетесь достичь, но чтобы ответить на ваш конкретный вопрос, вы можете использовать отражение следующим образом:
public static void PrintIfLookup(object obj)
{
if (obj == null)
throw new ArgumentNullException("obj");
// Find first implemented interface that is a constructed version of
// ILookup<,>, or null if no such interface exists.
var lookupType = obj
.GetType()
.GetInterfaces()
.FirstOrDefault
(i => i.IsGenericType &&
i.GetGenericTypeDefinition() == typeof(ILookup<,>));
if (lookupType != null)
{
// It is an ILookup<,>. Invoke the PrintLookup method
// with the correct type-arguments.
// Method to invoke is private and static.
var flags = BindingFlags.NonPublic | BindingFlags.Static;
// Assuming the containing type is called Foo.
typeof(Foo).GetMethod("PrintLookup", flags)
.MakeGenericMethod(lookupType.GetGenericArguments())
.Invoke(null, new[] { obj });
}
}
private static void PrintLookup<TKey, TElement>(ILookup<TKey, TElement> lookup)
{
// TODO: Printing logic
}
Я пытался написать это таким образом, чтобы вы могли написать логику печати строго типизированным способом с помощью шаблонов. Если вы предпочитаете, вы можете вместо этого сделать еще больше размышлений, чтобы получить ключ и значения из каждого IGrouping<,>
в поиске.
РЕДАКТИРОВАТЬ : Кстати, если вы находитесь на C # 4, вы можете заменить все тело оператора if
на:
PrintLookup((dynamic)obj);