Wenn ich die folgende Wrapper-Klasse habe:Umgang mit generischen Eigenschaften durch Reflexion
public class Wrapper<T>
{
public T Data { get; set; }
public string[] Metadata { get;set;
}
und eine andere Klasse setzt dann diesen Wert ohne Generika:
public class SomeOtherClass
{
public object WrappedData { get;set };
}
, wie kann ich an den ursprünglichen ungeöffneten Daten erhalten ?
kann ich es testen, wie mit etwas:
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Wrapper<>))
{
dynamic originalValue = someOtherClass.WrappedData;
}
aber ich kann nicht, dann rufen Sie die .Data
Eigenschaft auf originalValue
, eine RuntimeBinderException
bekommen.
aktualisieren
Ein wenig mehr Kontext helfen könnte. Ich arbeite an einem WebAPI, in dem ich HATEOAS implementieren möchte. Daher enthält meine Wrapperklasse die Daten, die zurückgegeben werden, plus Metadaten, und ich schreibe einen Aktionsfilter, der die Daten auspackt, sie im Antworttext zurückgibt und die Metadaten in Antwortheaders einfügt. Der Aktionsfilter wird zur Zeit wie folgt umgesetzt:
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Request.Method == HttpMethod.Get)
{
var objectContent = actionExecutedContext.Response.Content as ObjectContent;
if (objectContent != null)
{
var type = objectContent.ObjectType;
var formatter = actionExecutedContext
.ActionContext
.ControllerContext
.Configuration
.Formatters
.First(f => f.SupportedMediaTypes
.Contains(new MediaTypeHeaderValue(actionExecutedContext
.Response
.Content
.Headers
.ContentType
.MediaType)));
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Wrapper<>))
{
dynamic value = objectContent.Value;
actionExecutedContext.Response.Content = new ObjectContent(value.Data.GetType(), value.Data, formatter);
}
}
}
base.OnActionExecuted(actionExecutedContext);
}
Offensichtlich nicht alle meine API-Endpunkte zur Zeit ihre Daten wickeln, so dass, wenn die Antwort nicht eine Wrapper<T>
Instanz zurückkehrt, möchte ich ohne Änderung der Antwort der Aktion Filter verlassen. Wenn dies der Fall ist, dann ziehe den Wert .Data
heraus und schreibe den Antworttext damit neu.
Was bedeutet 'enthalten WrapperData'?Wenn es nur den Wert von "Wrapper .Data" enthält, ist es klar. Wenn es den gesamten Wrapper enthält, sollten wir auf der Initialisierungsseite nach einem Problem suchen. –
Was enthält 'Typ' Variable? –