C# 检查图元在revit api中是否具有特定参数
在Revit API中,如果要获取参数,请发送其C# 检查图元在revit api中是否具有特定参数,c#,revit-api,C#,Revit Api,在Revit API中,如果要获取参数,请发送其enum,然后获取该参数并将其转换为所需的类型 但有时参数丢失,因此它返回null,并且null.AsDouble()或null.AsValueString()抛出null异常 我检索了这么多参数,并且使用了三元运算符,但我不确定这是否是处理此问题的最佳方法 string typemark = e.get_Parameter(BuiltInParameter.ALL_MODEL_TYPE_MARK)!=null?wt.get_Parameter(B
enum
,然后获取该参数并将其转换为所需的类型
但有时参数丢失,因此它返回null
,并且null.AsDouble()
或null.AsValueString()
抛出null异常
我检索了这么多参数,并且使用了三元运算符,但我不确定这是否是处理此问题的最佳方法
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));
}
我得到一个例外:
方法“namespace.Extensions.CheckParameterAndFetch(Autodesk.Revit.DB.Element、,
无法推断Autodesk.Revit.DB.BuiltInParameter,System.Type)“”
从用法来看。尝试显式指定类型参数。(CS0411)我认为使用最新的.NET框架,您可以这样称呼它:var param=v.get_参数(内置参数.ALL_MODEL_COST)?.AsInteger()
注意get\u参数()调用后的“?”。检查返回的参数是否为null
,如果为null
,则不会调用AsInteger()
。以下是更多信息:
string typeName = wt.CheckParameterAndFetch(BuiltInParameter.ALL_MODEL_TYPE_NAME,typeof(string));