如何制作从字典<字符串,对象中提取不同类型的通用方法>



我想创建一个方法,负责根据输入参数键获取值,并查找该值的类型,因为它是一个对象(可以是int, string, datetime…)

我创建了如下内容:

public T GetValueForKeyFromHeader<T> (string key)
{
object value = null;
var hasValue = Headers?.TryGetValue(key, out value!); //IDcitionary<string, object>
return (T)Convert.ChangeType(typeof(value), typeof(T)); 
//here on this line I have an error: 'value' is a variable but its used like a type
}

这个词典集合的一些例子://"apiKeyId","guid"//"CorrelationId" 333年//test";hello world">

我想提取这些值,并将它们放在我的非贫血模型中的每个属性:

public string Test{get;set;} = GetValueForKeyFromHeader("test");
public int CorrelationId{get;set;} = GetValueForKeyFromHeader("CorrelationId");
public string ApiKeyId {get;set;} = GetValueForKeyFromHeader("api_key_id");

根据我的经验,TypeDescriptor是一种可行的方法:

public static bool TryGetValue<TValue>(this IDictionary<string, object> self, string key, out TValue value)
{
if (!self.TryGetValue(key, out var _value))
{
value = default;
return false;
}
if (_value is TValue casted)
{
value = casted;
return true;
}
if (_value is string str)
{
var converter = TypeDescriptor.GetConverter(typeof(TValue));
if (converter.CanConvertFrom(typeof(string)))
{
value = (TValue)converter.ConvertFromInvariantString(str);
return true;
}
}
value = default;
return false;
}

你可以重写你的方法:

public T GetValueForKeyFromHeader<T> (string key)
{
return Headers?.TryGetValue(key, out var value) == true ? value : default;
}

您使用的Convert.ChangeType不正确,您需要传递要转换的对象。

return (T)Convert.ChangeType(value, typeof(T));

由于您实际上没有使用TryGetValue的结果,因此通过键访问对象也可能更简单。如果它不存在,你会得到一个KeyNotFoundException,在我看来,这将比你目前通过null得到的InvalidCastException更清楚。

var value = Headers[key];
return (T)Convert.ChangeType(value, typeof(T));

最新更新