检查元素在revit api中是否有某个参数

时间:2017-09-21 14:34:22

标签: c# revit-api

在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)

1 个答案:

答案 0 :(得分:1)

我认为使用最新的.NET框架,您可以这样称呼它:var param = v.get_Parameter(BuiltInParameter.ALL_MODEL_COST)?.AsInteger();注意'?'在get_Parameter()电话之后。检查返回的参数是null,如果AsInteger()则不会调用null。这里有更多信息:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators