在Revit API中,当您想要获取参数时,发送其enum
然后获取它并将其转换为您想要的类型。
但有时参数会丢失,因此返回null
,而null.AsDouble()
或null.AsValueString()
会抛出null exception
。
我检索了这么多参数,我使用的是三元运算符,但我不确定这是处理这个问题的最佳方法
string typemark = e.get_Parameter(BuiltInParameter.ALL_MODEL_TYPE_MARK)!=null?wt.get_Parameter(BuiltInParameter.ALL_MODEL_TYPE_MARK).AsValueString():"";
double cost = e.get_Parameter(BuiltInParameter.ALL_MODEL_COST)!=null?wt.get_Parameter(BuiltInParameter.ALL_MODEL_COST).AsDouble():0;
我正在考虑做一个更通用的函数,传递参数和我想要将结果转换为的类型。
public static T CheckParameterAndFetch<T>(this Element e, BuiltInParameter p, Type t)
{
if (e.get_Parameter(p) != null)
{
if (t.GetType() == typeof(string))
{
return (T)Convert.ChangeType(e.get_Parameter(p).AsValueString(), typeof(string));
}
else if (t.GetType() == typeof(double))
{
return (T)Convert.ChangeType(e.get_Parameter(p).AsDouble(), typeof(double));
}
else if (t.GetType() == typeof(int))
{
return (T)Convert.ChangeType((int)e.get_Parameter(p).AsDouble(), typeof(double));
}
}
else
{
if (t.GetType() == typeof(string))
{
return (T)Convert.ChangeType("", typeof(string));
}
else if (t.GetType() == typeof(double))
{
return (T)Convert.ChangeType(0, typeof(double));
}
else if (t.GetType() == typeof(int))
{
return (T)Convert.ChangeType(0, typeof(int));
}
}
return (T)Convert.ChangeType(null, typeof(string));
}
并在调用它时输入以下内容:
string typeName = wt.CheckParameterAndFetch(BuiltInParameter.ALL_MODEL_TYPE_NAME,typeof(string));
我得到了这个例外:
方法&#39; namespace.Extensions.CheckParameterAndFetch的类型参数(Autodesk.Revit.DB.Element, Autodesk.Revit.DB.BuiltInParameter,System.Type)&#39;无法推断 从用法。尝试显式指定类型参数。 (CS0411)
答案 0 :(得分:1)
我认为使用最新的.NET框架,您可以这样称呼它:var param = v.get_Parameter(BuiltInParameter.ALL_MODEL_COST)?.AsInteger();
注意'?'在get_Parameter()
电话之后。检查返回的参数是null
,如果AsInteger()
则不会调用null
。这里有更多信息: