سؤال

وأنا أساسا لديك شيء من هذا القبيل:

void Foo(Type ty)
{
    var result = serializer.Deserialize<ty>(inputContent);
}

Foo(typeof(Person));

ولا يعمل Deserialize<ty> لأنه كان يتوقع Deserialize<Person> بدلا من ذلك. كيف أعمل حول هذا؟

وأود أيضا أن نفهم كيفية عمل الأدوية والسبب انها لن تقبل ty وهو typeof(Person).

وتحرير: أنا يجب أن يذكر أن هذا هو مثال مفتعلة. لا يمكنني في الواقع تغيير التوقيع على وظيفة لأنه ينفذ واجهة.

وتحرير: مسلسل هو JavascriptSerializer وتنفيذها كما عامل تصفية العمل هنا. ويطلق عليه هكذا:

[JsonFilter(Param="test", JsonDataType=typeof(Person))]

الحل

وبناء على مارك وأنطون الردود:

var result = typeof(JavaScriptSerializer).GetMethod("Deserialize")
                 .MakeGenericMethod(JsonDataType)
                 .Invoke(serializer, new object[] { inputContent });
هل كانت مفيدة؟

المحلول

وإذا كان من المعروف ty في الترجمة من الوقت، لماذا لا مجرد

void Foo<T>()
{
    var result = serializer.Deserialize<T>(inputContext);
}

وإلا،

MethodInfo genericDeserializeMethod = serializer.GetType().GetMethod("Deserialize");
MethodInfo closedDeserializeMethod = genericDeserializeMethod.MakeGenericMethod(ty);
closedDeserializeMethod.Invoke(serializer, new object[] { inputContext });

نصائح أخرى

وأي مسلسل هذا؟ إذا كنت تعرف فقط Type في وقت التشغيل (لا وقت الترجمة)، وأنه لا يملك API غير عام، ثم قد تضطر إلى استخدام MakeGenericMethod:

void Foo(Type ty)
{
    object result = typeof(ContainingClass).GetMethod("Bar").
        .MakeGenericMethod(ty).Invoke(null, new object[] {inputContent});
}
public static T Bar<T>(SomeType inputContent) {
    return serializer.Deserialize<T>(inputContent);
}

استخدم

void Foo<T>(){ var result = serializer.Deserialize<T>(inputContent); }

ومع المكالمة التالية

Foo<Person>();

في هذه الحالة، فقط تفعل هذا:

void Foo<ty>()
{
    var result = serializer.Deserialize<ty>(inputContent);
}

Foo<Person>();

وعلى خلاف ذلك، تحتاج إلى استدعاء الأسلوب عام منضم المتأخر، لأن لديك للحصول على طريقة الصحيح لعام لأول مرة (لا يعرف في وقت الترجمة). إلقاء نظرة على MethodInfo. MakeGenericMethod الأسلوب.

وكما قلت لوسيرو،

void Foo<ty>()
{
    var result = serializer.Deserialize<ty>(inputContent);
}

Foo<Person>();

وتشير typeof (شخص) ليست هي الشيء نفسه شخص. الشخص هو نوع وقت الترجمة، في حين تشير typeof (شخص) هو تعبير <م> يعود مثيل النوع يمثلون معلومات نوع وقت التشغيل من شخص .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top