C# 检查图元在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

在Revit API中,如果要获取参数,请发送其
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));