একটি প্রকার ভেরিয়েবল ব্যবহার করে একটি ভেরিয়েবল কাস্ট করা


281

সি # তে আমি টাইপ অবজেক্টের একটি ভেরিয়েবল টি টাইপ টির একটি ভেরিয়েবলে কাস্ট করতে পারি যেখানে টাইপ ভেরিয়েবলের মধ্যে টি সংজ্ঞায়িত করা হয়?


12
কঠোরভাবে বিষয় নয়, তবে "কাস্ট" বলতে কী বোঝায় তা সম্পর্কে আপনি যথেষ্ট অস্পষ্ট বলে মনে করছেন যে কাস্ট অপারেটরের উদ্দেশ্য এবং শব্দার্থকতা কী তা অবিকলভাবে বোঝা ভাল ধারণা হতে পারে। এখানে একটি ভাল শুরু: ব্লগস.এমএসডিএন
এরিক লিপার্ট

2
আমি ভেবেছিলাম কিছু নিয়ে এসেছি। আপনার যদি Typeভেরিয়েবল থাকে তবে আপনি সেই ধরণের উদাহরণ তৈরি করতে প্রতিবিম্বটি ব্যবহার করতে পারেন। এবং তারপরে আপনি সেই ধরণের কোনও পরামিতি থেকে অনুমান করে আপনি যে ধরণের পছন্দ করতে চান তা ফেরত দিতে জেনেরিক পদ্ধতি ব্যবহার করতে পারেন। দুর্ভাগ্যক্রমে, যে কোনও প্রতিবিম্ব পদ্ধতি যা কোনও প্রকারের উদাহরণ তৈরি করে তার রিটার্ন টাইপ থাকবে object, সুতরাং আপনার জেনেরিক CastByExampleপদ্ধতিটিও ব্যবহার করবে object। সুতরাং এটি করার সত্যিই কোনও উপায় নেই এবং যদি সেখানেও থাকে তবে সদ্য কাস্ট করা অবজেক্টের সাথে আপনি কী করবেন? আপনি এর পদ্ধতি বা কিছু ব্যবহার করতে পারেননি কারণ আপনি এর ধরণ জানেন না।
কাইল

@ কাইলডেলানিকে ধন্যবাদ, আমি সম্পূর্ণ সম্মত! আমি আমার উত্তর ব্যাখ্যা করার চেষ্টা করে, এটা না সত্যিই যে ঢালাই দরকারী কিছু একটি করার ভিন্ন জিনিস প্রকার আসলে আপনি ব্যবহার করছেন সংজ্ঞা কিছু সময়ে ছাড়া। প্রকারের পুরো পয়েন্টটি সংকলক সময় প্রকারের পরীক্ষা করা। যদি আপনাকে কেবল অবজেক্টে কল করতে হয় তবে আপনি ব্যবহার করতে পারেন objectবা করতে পারেন dynamic। আপনি যদি গতিশীলভাবে বাহ্যিক মডিউলগুলি লোড করতে চান, আপনি ক্লাসগুলি একটি সাধারণ ইন্টারফেস ভাগ করতে এবং এটিতে বস্তুটি কাস্ট করতে পারেন। আপনি যদি তৃতীয় পক্ষের কোডটি নিয়ন্ত্রণ না করেন তবে ছোট মোড়ক তৈরি করুন এবং এতে ইন্টারফেস প্রয়োগ করুন।
জাইফ্রাক্স

উত্তর:


203

এখানে একটি castালাই এবং রূপান্তর একটি উদাহরণ:

using System;

public T CastObject<T>(object input) {   
    return (T) input;   
}

public T ConvertObject<T>(object input) {
    return (T) Convert.ChangeType(input, typeof(T));
}

সম্পাদনা:

মন্তব্যে কিছু লোক বলে যে এই উত্তরটি প্রশ্নের উত্তর দেয় না। তবে লাইনটি (T) Convert.ChangeType(input, typeof(T))সমাধান সরবরাহ করে। Convert.ChangeTypeপদ্ধতি দ্বিতীয় যুক্তি হিসাবে প্রদত্ত প্রকার কোনো বস্তু রূপান্তর করার চেষ্টা করে।

উদাহরণ স্বরূপ:

Type intType = typeof(Int32);
object value1 = 1000.1;

// Variable value2 is now an int with a value of 1000, the compiler 
// knows the exact type, it is safe to use and you will have autocomplete
int value2 = Convert.ChangeType(value1, intType);

// Variable value3 is now an int with a value of 1000, the compiler
// doesn't know the exact type so it will allow you to call any
// property or method on it, but will crash if it doesn't exist
dynamic value3 = Convert.ChangeType(value1, intType);

আমি জেনেরিক্স সঙ্গে উত্তর লিখেছি কারণ আমি মনে করি এটি একটি খুব সম্ভবত কোড গন্ধ সাইন যখন আপনি কাস্ট করতে চান a somethingকরতে a something elseপ্রকৃত টাইপ সামলাচ্ছে ছাড়া। সঠিক ইন্টারফেসের সাথে যা 99.9% বারের প্রয়োজন হবে না। এটি সম্ভবত কিছু ধারালো মামলা রয়েছে যখন এটি প্রতিবিম্বিত হয় যে এটি বোধগম্য হতে পারে, তবে আমি এই ক্ষেত্রেগুলি এড়াতে পরামর্শ দেব।

সম্পাদনা 2:

কয়েকটি অতিরিক্ত টিপস:

  • আপনার কোডটি যথাসম্ভব টাইপ-নিরাপদ রাখার চেষ্টা করুন। যদি সংকলকটি প্রকারটি না জানে, তবে এটি আপনার কোডটি সঠিক কিনা তা পরীক্ষা করতে পারে না এবং স্বতঃপূরণের মতো জিনিসগুলি কাজ করবে না। সহজভাবে বলেছিলেন: আপনি যদি সংকলনের সময় (গুলি) টাইপগুলি পূর্বাভাস দিতে না পারেন তবে সংকলকটি কীভাবে সক্ষম হবেন ?
  • আপনি যে ক্লাসগুলির সাথে কাজ করছেন সেগুলি যদি একটি সাধারণ ইন্টারফেস বাস্তবায়িত করে তবে আপনি সেই ইন্টারফেসে মানটি দিতে পারেন। অন্যথায় আপনার নিজের ইন্টারফেস তৈরি করার বিষয়টি বিবেচনা করুন এবং ক্লাসগুলি সেই ইন্টারফেসটি বাস্তবায়ন করুন।
  • আপনি যদি বাহ্যিক লাইব্রেরিগুলির সাথে কাজ করছেন যা আপনি গতিশীলভাবে আমদানি করছেন, তবে একটি সাধারণ ইন্টারফেসের জন্যও পরীক্ষা করুন। অন্যথায় ইন্টারফেস প্রয়োগ করে এমন ছোট ছোট র্যাপার ক্লাস তৈরির কথা বিবেচনা করুন।
  • আপনি বস্তুর উপর কল করার জন্য, কিন্তু টাইপ যত্ন সম্পর্কে না, তারপরে একটি মান সংরক্ষণ চান objectবা dynamicপরিবর্তনশীল।
  • জেনেরিকস পুনরায় ব্যবহারযোগ্য কোড তৈরির দুর্দান্ত উপায় হতে পারে যা জড়িত সঠিক প্রকারগুলি না জেনে বিভিন্ন প্রকারের ক্ষেত্রে প্রযোজ্য।
  • আপনি যদি আটকে থাকেন তবে কোনও ভিন্ন পদ্ধতির বা কোড রিফ্যাক্টরটি বিবেচনা করুন। আপনার কোডটি কি আসলে গতিশীল হতে হবে? এটিতে যে কোনও ধরণের অ্যাকাউন্ট রয়েছে?

145
আমি জানি না কীভাবে এটি ওপিকে সহায়তা করছে। তার টাইপ ভেরিয়েবল রয়েছে, তেমন নয় T
নওফাল

12
@ নওফাল, মূলত লাইনটি Convert.ChangeType(input, typeof(T));সমাধান দেয়। আপনি সহজেই typeof(T)কোনও বিদ্যমান ধরণের ভেরিয়েবলের সাথে প্রতিস্থাপন করতে পারেন । একটি আরও ভাল সমাধান (যদি সম্ভব হয়) হ'ল গতিশীল ধরণের সমস্ত একসাথে প্রতিরোধ করা।
জিফ্র্যাক্স

59
@ জিফ্রাক্স, এটির জন্য এখনও এমন কাস্টের প্রয়োজন নেই Tযা উপলভ্য নয়।
নওফাল

4
আমি জানি ফলস্বরূপ অবজেক্টটি আসলে টাইপের Tতবে এখনও আপনি কেবল objectএকটি রেফারেন্স হিসাবে পান । হুম, আমি এই প্রশ্নটিকে আকর্ষণীয় মনে করেছিলাম যে ওপিতে কেবল Typeপরিবর্তনশীল এবং অন্য কোনও তথ্য নেই। যেন পদ্ধতিটির স্বাক্ষরটি Convert(object source, Type destination):) তবুও আমি আপনার পয়েন্টটি
পাই

10
এটি এই প্রশ্নের সমাধান কীভাবে? আমি একই সমস্যা পেয়েছি এবং আমার জেনেরিক <টি> নেই। আমার কাছে কেবল টাইপ ভেরিয়েবল রয়েছে।
নুরি তাসদেমির

114

অন্যান্য উত্তরগুলিতে "গতিশীল" প্রকারের উল্লেখ নেই। সুতরাং আরও একটি উত্তর যুক্ত করতে, আপনি স্ট্যাটিক টাইপের সাথে রূপান্তরিত অবজেক্টটি না ফেলে আপনার ফলস্বরূপ অবজেক্টটি সংরক্ষণ করতে "ডায়নামিক" টাইপ ব্যবহার করতে পারেন।

dynamic changedObj = Convert.ChangeType(obj, typeVar);
changedObj.Method();

মনে রাখবেন যে "ডায়নামিক" ব্যবহারের সাথে সংকলক স্থির প্রকারের চেকিংকে বাইপাস করছে যা আপনি যদি সতর্ক না হন তবে সম্ভাব্য রানটাইম ত্রুটিগুলি উপস্থাপন করতে পারে।


19
এটা সঠিক উত্তর. ডায়নামিক কীওয়ার্ড ছাড়া টাইপ অফ (চেঞ্জডবজ) হ'ল "অবজেক্ট"। ডায়নামিক কীওয়ার্ডের সাহায্যে এটি নির্দ্বিধায় কাজ করে এবং টাইপফ (চেঞ্জোবজেক্ট) টাইপবারের মতো একই ধরণের সঠিকভাবে প্রতিফলিত করে। অতিরিক্তভাবে আপনি (টি) castালাই করার প্রয়োজন নেই যা আপনি টাইপটি জানেন না যদি আপনি করতে পারেন না।
رشিঞ্জ

5
এই সমাধানটি ব্যবহার করার সময় আমি "অবজেক্ট অবশ্যই আইকনভার্টেবল প্রয়োগ করতে" ব্যতিক্রম পেয়েছি। কোন সাহায্য?
নুরি তাসদেমির

@ নুরিটিসডেমির বলা শক্ত, তবে আমি বিশ্বাস করি আপনি যে রূপান্তরটি করছেন তা আইকনভারটিবল ছাড়া সম্ভব নয়। আপনার রূপান্তর জড়িত কি কি ধরনের?
maulik13

এটি কাজ করার সময়, গতিশীলতা ব্যবহার করে একটি পারফরম্যান্স পেনাল্টি রয়েছে। আপনি অন্যান্য রানটাইমের সাথে কাজ না করা পর্যন্ত আমি এগুলি ব্যবহারের বিরুদ্ধে সুপারিশ করব (এটি যা গতিবিদ্যার জন্য ডিজাইন করা হয়েছিল)।
বোলো

19

এখানে কোনও অবজেক্ট কাস্ট করার আমার পদ্ধতি তবে জেনেরিক ধরণের পরিবর্তনশীল নয়, বরং System.Typeগতিশীলভাবে:

আমি রান-টাইমে ল্যাম্বডা এক্সপ্রেশন তৈরি করি System.Linq.Expressions, টাইপ করে Func<object, object>, যা এর ইনপুটটি আনবক্স করে, পছন্দসই ধরণের রূপান্তর সম্পাদন করে ফলাফলটি বাক্সযুক্ত দেয়। একটি নতুন প্রয়োজন কেবল কাস্ট করা সমস্ত ধরণের জন্যই নয়, তবে যে ধরণের কাস্ট করা হয় তাদের জন্যও (আনবক্সিং পদক্ষেপের কারণে)। এই প্রতিচ্ছবি তৈরি করা অত্যন্ত সময় সাশ্রয়ী, কারণ প্রতিচ্ছবি, সংকলন এবং ডুডের অধীনে গতিশীল পদ্ধতি বিল্ডিং। ভাগ্যক্রমে একবার তৈরি হয়ে গেলে, এক্সপ্রেশনগুলি বারবার এবং উচ্চ ওভারহেড ছাড়াই আহ্বান করা যেতে পারে, তাই আমি প্রত্যেককে ক্যাশে করি।

private static Func<object, object> MakeCastDelegate(Type from, Type to)
{
    var p = Expression.Parameter(typeof(object)); //do not inline
    return Expression.Lambda<Func<object, object>>(
        Expression.Convert(Expression.ConvertChecked(Expression.Convert(p, from), to), typeof(object)),
        p).Compile();
}

private static readonly Dictionary<Tuple<Type, Type>, Func<object, object>> CastCache
= new Dictionary<Tuple<Type, Type>, Func<object, object>>();

public static Func<object, object> GetCastDelegate(Type from, Type to)
{
    lock (CastCache)
    {
        var key = new Tuple<Type, Type>(from, to);
        Func<object, object> cast_delegate;
        if (!CastCache.TryGetValue(key, out cast_delegate))
        {
            cast_delegate = MakeCastDelegate(from, to);
            CastCache.Add(key, cast_delegate);
        }
        return cast_delegate;
    }
}

public static object Cast(Type t, object o)
{
    return GetCastDelegate(o.GetType(), t).Invoke(o);
}

মনে রাখবেন যে এটি যাদু নয়। কাস্টিং কোডে ঘটে না, যেমন এটি dynamicকীওয়ার্ডের সাথে হয় , কেবলমাত্র বস্তুর অন্তর্নিহিত ডেটা রূপান্তরিত হয়। সংকলনের সময় আমরা আমাদের শ্রেনীটি ঠিক কী ধরণের হতে পারে তার সমাধানটি অবাস্তব করে তুলে আবেগের সাথে এখনও বেঁধে রেখেছি। আমি এটি একটি হ্যাক হিসাবে লিখেছিলাম স্বেচ্ছাসেবী প্রকার দ্বারা সংজ্ঞায়িত রূপান্তর অপারেটরদের আহ্বান জানাতে, তবে সম্ভবত যে কেউ এইরকম আরও ভাল ব্যবহারের কেস খুঁজে পেতে পারে।


2
প্রয়োজনীয়using System.Linq.Expressions;
অ্যারন ডি

4
আমার জন্য এটি জিফ্রাক্সের উত্তরের মতো একই সমস্যায় ভুগছে। আমি প্রত্যাবর্তিত অবজেক্টে পদ্ধতিগুলি প্রার্থনা করতে পারি না কারণ এটি এখনও "অবজেক্ট" ধরণের। কিনা আমি তার পদ্ধতি ব্যবহার ( "একটি" নীচে) অথবা আপনার পদ্ধতি ( "B" নীচে) আমি (টি) ঢালাই একই ভুল পান - 'T' "একটি পরিবর্তনশীল কিন্তু এটি একটি টাইপ মত ব্যবহার করা হয়।Type t = typeof(MyGeneric<>).MakeGenericType(obj.OutputType); var a = (t)Convert.ChangeType(obj, t); var b = (t)Caster.Cast(t, obj);
muusbolla

@ মমসবোল্লা জিফ্রাক্সের মূল উত্তরটি জেনেরিকস এবং টাইপ ভেরিয়েবল ব্যবহার করে, না Type। আপনার যদি সমস্ত টাইপ অবজেক্ট থাকে তবে আপনি সাধারণ ingালাই সিনট্যাক্স ব্যবহার করে কাস্ট করতে পারবেন না। আপনি যদি রানটাইমের সময় নয়, সংকলনের সময় কোনও প্রকারের টি হিসাবে এই অবজেক্টটি ব্যবহার করতে সক্ষম হতে চান তবে আপনার এটি টাইপ ভেরিয়েবল বা কেবল প্রকৃত টাইপের নাম ব্যবহার করে কাস্ট করতে হবে। আপনি জাফ্রাক্সের উত্তরটি ব্যবহার করে প্রাক্তনটি করতে পারেন।
অ্যাশলে

8

সরলতার জন্য বক্সিং এবং আনবক্সিংকে একপাশে রেখে দেওয়া, উত্তরাধিকারক্রমক্রম অনুসারে কাস্টিংয়ের সাথে জড়িত কোনও নির্দিষ্ট রানটাইম অ্যাকশন নেই। এটি বেশিরভাগ সময় একটি সংকলন সময় জিনিস। মূলত, একটি নিক্ষেপকারী চলকটির মানটিকে অন্য ধরণের হিসাবে বিবেচনা করতে বলে।

অভিনয়ের পরে আপনি কী করতে পারেন? আপনি টাইপটি জানেন না, সুতরাং আপনি এটিতে কোনও পদ্ধতিতে কল করতে সক্ষম হবেন না। আপনি করতে পারেন এমন কোনও বিশেষ জিনিস থাকবে না। বিশেষত, এটি কেবল তখনই কার্যকর হতে পারে যখন আপনি সংকলনের সময় সম্ভাব্য প্রকারগুলি জানেন, ম্যানুয়ালি কাস্ট করে এবং প্রতিটি মামলা পৃথকভাবে ifবিবৃতি দিয়ে পরিচালনা করবেন :

if (type == typeof(int)) {
    int x = (int)obj;
    DoSomethingWithInt(x);
} else if (type == typeof(string)) {
    string s = (string)obj;
    DoSomethingWithString(s);
} // ...

1
আপনি দয়া করে আমার প্রশ্নের সাথে এই পরিষ্কার সম্পর্কে ব্যাখ্যা করতে পারেন?
থেরিংস্টাররা

আমি যা বোঝানোর চেষ্টা করছি তা হল, আপনি এর পরে কী করতে পারবেন? সি #
সংকলকটির

তুমি ঠিক বলছো. আমি দুটি ভেরিয়েবলের প্রত্যাশিত প্রকারগুলি জানি যা পদ্ধতিতে 'অবজেক্ট' হিসাবে প্রেরণ করা হয়। আমি ভেরিয়েবলগুলিতে সঞ্চিত প্রত্যাশিত ধরণের কাস্ট করতে চাই এবং সেগুলি সংগ্রহের সাথে যুক্ত করতে চাই। প্রকারে শাখা করা এবং একটি সাধারণ castালাই চেষ্টা করা এবং ত্রুটিগুলি ধরা খুব সহজ।
থেরিংস্টারার্স

4
আপনার উত্তরটি ভাল, তবে কেবল নিট-পিক হওয়ার জন্য, আমি লক্ষ করেছি যে কাস্টগুলি কখনই ভেরিয়েবলগুলিকে প্রভাবিত করে না । অন্য ধরণের ভেরিয়েবলের ক্ষেত্রে ভেরিয়েবল কাস্ট করা বৈধ নয় ; পরিবর্তনশীল প্রকারগুলি সি # তে অবিচ্ছিন্ন। আপনি কেবল ভেরিয়েবলে সঞ্চিত মানটিকে অন্য ধরণের কাস্ট করতে পারেন ।
এরিক লিপার্ট

গতিশীল টাইপিংয়ের সি # 4.0 এর ভূমিকা কি এই উত্তরটির কোনও পরিবর্তন করে?
ড্যানিয়েল টি।

6

তুমি এটা কিভাবে করতে পারলে? আপনার টি টাইপের একটি ভেরিয়েবল বা ক্ষেত্রের প্রয়োজন যেখানে আপনি castালাইয়ের পরে অবজেক্টটি সঞ্চয় করতে পারেন তবে আপনি কেবল রানটাইমে টি জানেন তবে কীভাবে আপনার এইরকম চলক বা ক্ষেত্র থাকতে পারে? সুতরাং, না, এটি সম্ভব নয়।

Type type = GetSomeType();
Object @object = GetSomeObject();

??? xyz = @object.CastTo(type); // How would you declare the variable?

xyz.??? // What methods, properties, or fields are valid here?

3
আপনি যদি জেনেরিক ক্লাস ব্যবহার করে থাকেন তবে এটি টি টাইপের রিটার্ন মান সহ একটি পদ্ধতি নির্ধারণ করে, আপনার এটি করতে হবে। উদাহরণস্বরূপ টি এর একটি দৃষ্টিতে একটি স্ট্রিংকে পার্স করে এবং এটি ফেরত।
অলিভার ফ্রেডরিখ

7
ভাগ্যক্রমে এটি সঠিক উত্তর নয়। Maulik13 এর উত্তর দেখুন।
তাড়াতাড়ি

3
স্বর্গের নামে কোথায় আপনি একটি CastToপদ্ধতি খুঁজে পেয়েছেন Object?
অধ্যাপক

3

যখন এটি এনাম টাইপ করার জন্য আসে:

private static Enum GetEnum(Type type, int value)
    {
        if (type.IsEnum)
            if (Enum.IsDefined(type, value))
            {
                return (Enum)Enum.ToObject(type, value);
            }

        return null;
    }

এবং আপনি এটিকে ডাকবেন:

var enumValue = GetEnum(typeof(YourEnum), foo);

ইন্ট ভ্যালু অনুসারে কয়েকটি এনাম প্রকারের বিশিষ্ট বৈশিষ্ট্যের মান পাওয়ার ক্ষেত্রে এটি আমার জন্য প্রয়োজনীয় ছিল:

public enum YourEnum
{
    [Description("Desc1")]
    Val1,
    [Description("Desc2")]
    Val2,
    Val3,
}

public static string GetDescriptionFromEnum(Enum value, bool inherit)
    {
        Type type = value.GetType();

        System.Reflection.MemberInfo[] memInfo = type.GetMember(value.ToString());

        if (memInfo.Length > 0)
        {
            object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), inherit);
            if (attrs.Length > 0)
                return ((DescriptionAttribute)attrs[0]).Description;
        }

        return value.ToString();
    }

এবং তারপর:

string description = GetDescriptionFromEnum(GetEnum(typeof(YourEnum), foo));
string description2 = GetDescriptionFromEnum(GetEnum(typeof(YourEnum2), foo2));
string description3 = GetDescriptionFromEnum(GetEnum(typeof(YourEnum3), foo3));

বিকল্পভাবে (আরও ভাল পদ্ধতির), এ জাতীয় ingালাই দেখতে দেখতে দেখতে পারা যায়:

 private static T GetEnum<T>(int v) where T : struct, IConvertible
    {
        if (typeof(T).IsEnum)
            if (Enum.IsDefined(typeof(T), v))
            {
                return (T)Enum.ToObject(typeof(T), v);
            }

        throw new ArgumentException(string.Format("{0} is not a valid value of {1}", v, typeof(T).Name));
    }

1

জাইফ্র্যাক্সের উত্তরটি ব্যবহার করার সময় "অবজেক্টটি অবশ্যই আইকনভার্টেবল কার্যকর করতে হবে" ব্যতিক্রমটি পেতে কিছু খুঁজে পাওয়ার পরেও (ইন্টারফেস বাস্তবায়ন ব্যতীত) .. আমি কিছুটা অপ্রচলিত কিছু চেষ্টা করেছি এবং আমার পরিস্থিতির জন্য কাজ করেছি।

নিউটনসফট.জসন নুগেট প্যাকেজটি ব্যবহার করা হচ্ছে ...

var castedObject = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(myObject), myType);

1

ক্ষতিকারক, সমস্যাটি আপনার কাছে কোনও টি নেই have

আপনার কেবল টাইপ ভেরিয়েবল রয়েছে।

এমএসের প্রতি ইঙ্গিত, আপনি যদি এমন কিছু করতে পারেন

TryCast<typeof(MyClass)>

আমাদের সব সমস্যার সমাধান যদি।


0

কোনও মন্তব্য দেওয়ার জন্য আপনার 50 টির বেশি খ্যাতি কেন দরকার তা আমি কখনই বুঝতে পারি না তবে আমি কেবল বলেছিলাম যে @ কর্ট উত্তরটি হ'ল আমি যা দেখছিলাম এবং আশা করি অন্য কেউ।

আমার উদাহরণে, আমার কাছে একটি অ্যাকশনফিলারঅ্যাট্রিবিউট রয়েছে যা আমি জসন প্যাচ নথির মান আপডেট করতে ব্যবহার করেছিলাম। প্যাচ ডকুমেন্টের জন্য টি মডেলটি আমার কাছে যা ছিল তা আমি পাইনি এটি একটি সাধারণ জাসনপ্যাচ ডকুমেন্টে সিরিয়ালাইজ ও ডিজিটালাইজ করতে হয়েছিল, এটি সংশোধন করতে হবে, তারপরে কারণ আমার কাছে টাইপটি ছিল, সিরিয়ালাইজ করা হয়েছিল এবং এটিকে আবার টাইপটিতে ডিসরিয়ালাইজ করা হয়েছে।

Type originalType = //someType that gets passed in to my constructor.

var objectAsString = JsonConvert.SerializeObject(myObjectWithAGenericType);
var plainPatchDocument = JsonConvert.DeserializeObject<JsonPatchDocument>(objectAsString);

var plainPatchDocumentAsString= JsonConvert.SerializeObject(plainPatchDocument);
var modifiedObjectWithGenericType = JsonConvert.DeserializeObject(plainPatchDocumentAsString, originalType );

-1
public bool TryCast<T>(ref T t, object o)
{
    if (
        o == null
        || !typeof(T).IsAssignableFrom(o.GetType())
        )
        return false;
    t = (T)o;
    return true;
}

2
আপনি কি দয়া করে এটি উল্লেখ করতে পারেন যে এই উত্তরটি অন্য উত্তরগুলির থেকে কীভাবে আলাদা এবং এই সমাধানটি কোথায় উপযুক্ত?
ক্লাউস গুটার


-2

গন্তব্যের ধরণ না জেনে রানটাইমের সময় যদি আপনাকে অবজেক্টগুলি কাস্ট করতে হয় তবে আপনি গতিশীল রূপান্তরকারী তৈরি করতে প্রতিবিম্বটি ব্যবহার করতে পারেন।

এটি একটি সরলীকৃত সংস্করণ (উত্পন্ন পদ্ধতিতে ক্যাশে ছাড়াই):

    public static class Tool
    {
            public static object CastTo<T>(object value) where T : class
            {
                return value as T;
            }

            private static readonly MethodInfo CastToInfo = typeof (Tool).GetMethod("CastTo");

            public static object DynamicCast(object source, Type targetType)
            {
                return CastToInfo.MakeGenericMethod(new[] { targetType }).Invoke(null, new[] { source });
            }
    }

তাহলে আপনি এটি কল করতে পারেন:

    var r = Tool.DynamicCast(myinstance, typeof (MyClass));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.