我想创建一个方法,负责根据输入参数键获取值,并查找该值的类型,因为它是一个对象(可以是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));