Вы можете создать универсальный метод расширения, а затем использовать его для объекта, например:
public static class Extensions
{
public static KeyValuePair<TKey, TValue> ToKeyValuePair<TKey, TValue>(this Object obj)
{
// if obj is null throws exception
Contract.Requires(obj != null);
// gets the type of the obj parameter
var type = obj.GetType();
// checks if obj is of type KeyValuePair
if (type.IsGenericType && type == typeof(KeyValuePair<TKey, TValue>))
{
return new KeyValuePair<TKey, TValue>(
(TKey)type.GetProperty("Key").GetValue(obj, null),
(TValue)type.GetProperty("Value").GetValue(obj, null)
);
}
// if obj type does not match KeyValuePair throw exception
throw new ArgumentException($"obj argument must be of type KeyValuePair<{typeof(TKey).FullName},{typeof(TValue).FullName}>");
}
, и использование будет выглядеть так:
KeyValuePair<string,long> kvp = obj.ToKeyValuePair<string,long>();
Достаточно ли вводная статья в Википедии ? В нем есть много ссылок на более подробную информацию.
Также есть подкаст на радио для разработки программного обеспечения .
Здесь , здесь и здесь - некоторые академические статьи, но их может быть труднее читать и понимать.
Попробуйте эту статью , в которой впервые было представлено то, что стало инструментом Microsoft Prefast . Это один из самых успешных инструментов статического анализа.