在静态函数中调用 ObjectContent 会导致“对象引用未设置为对象的实例”错误

本文关键字:设置 对象 错误 实例 对象引用 调用 静态函数 ObjectContent | 更新日期: 2023-09-27 18:34:02

来自如何获取对象类型并将其传递给 ObjectContent 的已接受答案,这是关于将class类型传递给新创建的函数,其中包含ObjectContent对象才能工作。

我的下一步是将其转换为静态类/函数。 尽我所能,将type.GetMethod("ObjectContent", ...)分配给变量时methodInfo出现异常错误。

错误消息是"对象引用未设置为对象的实例"。

type.GetMethod("ObjectContent", ...)这里似乎有什么问题? 此问题的解决方法是什么?

public class XmlError
{
    public string Message { get; set; }
}
public static class XmlBuilderTools 
{
    public static HttpResponseMessage ErrorResponse(object parmXmlErrorLayout)
    {
        HttpResponseMessage httpResponseMsg = new HttpResponseMessage();
        Type type = parmXmlErrorLayout.GetType();  //typeof(parmXmlErrorLayout);
        System.Reflection.MethodInfo methodInfo = type.GetMethod("ObjectContent", (System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.FlattenHierarchy));
        returnHttpResponseMessage.Content = (HttpContent)methodInfo.Invoke(null, new object[] { parmXmlErrorLayout, new XmlMediaTypeFormatter() });
        httpResponseMsg.StatusCode = HttpStatusCode.BadRequest;
    }
}
public class Foo()
{
   public HttpResponseMessage FooFoo()
   {
       //Acutual scripts...
       XmlError xmlError = new XmlError();
       xmlError.Message = "Foo";
       return XmlBuilderTools.ErrorResponse(xmlError);
   }
}

最初这将在非静态类/对象中工作

returnHttpResponseMessage.Content = new ObjectContent<XmlError>(xmlError, new CustomXmlFormatter());

在静态函数中调用 ObjectContent 会导致“对象引用未设置为对象的实例”错误

你有

 Type type = parmXmlDataLayout.GetType();  //typeof(parmXmlDataLayout);

但你通过了

object parmXmlErrorLayout

所以不应该是

Type type = parmXmlErrorLayout.GetType();  //typeof(parmXmlErrorLayout);

如果没有,那么您需要定义 parmXmlDataLayout 的实例,因为我在您的代码中任何地方都没有看到它。 因此,为什么您会从类型中得到错误。Gettype,类型可能为空

Edited by fletchsod - Alternative workaround to the problem

而不是调用,似乎还有另一个重载ObjectContent工作得很好。 我嘟! 太多我以前没有使用过的相同对象。 问题的解决方案是

foo.Content = new ObjectContent(parmXmlErrorLayout.GetType(), parmXmlErrorLayout, new CustomXmlFormatter());