を経由して、一般的な性質の取り扱い:は反射
public class Wrapper<T>
{
public T Data { get; set; }
public string[] Metadata { get;set;
}
と別のクラスは、ジェネリックずにその値を公開します。
public class SomeOtherClass
{
public object WrappedData { get;set };
}
、私は元開封されたデータを取得する方法?
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Wrapper<>))
{
dynamic originalValue = someOtherClass.WrappedData;
}
を、私はその後、RuntimeBinderException
を取得し、originalValue
に.Data
プロパティを呼び出すことはできません。
私は次のようなものを使用して、それをテストすることができます。
もう少し文脈を助けるかもしれない
更新。私はHATEOASを実装したいWebAPIに取り組んでいます。だから、私のラッパークラスには、返されるデータとメタデータが含まれています。データをアンラップし、レスポンスボディーに戻し、応答ヘッダーにメタデータを入れるアクションフィルターを作成しています。次のようにアクションフィルタは現在実装されています
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);
}
を明らかに私のすべてのAPIエンドポイントは、現在、そのデータをラップではないので、応答がWrapper<T>
インスタンスを返すされていない場合、私は応答を変更することなく、アクションフィルタを終了します。そうである場合は、.Data
の値を取り出し、応答本体を書き換えます。
'何が含まれてWrapperData'んを行うことができますか?'Wrapper .Data'の値しか含まれていなければ、それは明らかです。ラッパー全体が含まれている場合は、初期化側で問題を探す必要があります。 –
'type'変数は何を含んでいますか? –