কীভাবে তার প্রকৃত ধরণের অবজেক্টটি কাস্ট করা যায়?


120

যদি আমার থাকে:

void MyMethod(Object obj) {   ...   }

objএর প্রকৃত প্রকারটি কীভাবে আমি কাস্ট করতে পারি ?


2
টাইপটি কি সংকলনের সময় জানা যায়?
psubsee2003

1
এবং আপনি এটি থেকে কি অর্জন আশা করেন? আপনি কী অর্জন করতে চাইছেন তা দয়া করে আমাদের জানান, কীভাবে আপনি এটি অর্জন করবেন বলে আশা করছেন।
জন স্কিটি

@ জোনস্কিট: আমি অবজেক্ট থেকে কোনও ফাংশন কল করতে সক্ষম হতে চাই। obj.MyFunction();যদিও আমি জানি যে আসল অবজেক্টটিতে সেই ফাংশন রয়েছে তা বর্তমানে সংকলন করে না।
পল ল্যাসিটার

@ psubsee2003: না এটি হয় না, কারণ এটি একটি অবজেক্ট রেফারেন্স যা ইন্টারপ দ্বারা পাস করা হচ্ছে।
পল ল্যাসিটার

3
@ পললাসিটার: আপনি যদি প্রকারটি জানেন না, তবে MyFunctionপদ্ধতিটি কী ঘোষণা করে ?
জন স্কিটি

উত্তর:


194

আপনি যদি প্রকৃত প্রকারটি জানেন তবে কেবল:

SomeType typed = (SomeType)obj;
typed.MyFunction();

আপনি যদি প্রকৃত প্রকারটি জানেন না, তবে: আসলেই নয়, না। পরিবর্তে আপনাকে এর মধ্যে একটি ব্যবহার করতে হবে:

  • প্রতিফলন
  • একটি সুপরিচিত ইন্টারফেস বাস্তবায়ন
  • প্রগতিশীল

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

// reflection
obj.GetType().GetMethod("MyFunction").Invoke(obj, null);

// interface
IFoo foo = (IFoo)obj; // where SomeType : IFoo and IFoo declares MyFunction
foo.MyFunction();

// dynamic
dynamic d = obj;
d.MyFunction();

1
সুইফটে সমমানের বাক্য গঠন কী?
নগেন্দ্র রাও

1
মাইন্ডমাইন্ড, asটাইপকাস্টিং এবং type(of: ClassName)ফাংশন জন্য উদাহরণ টাইপ চেক করতে পাওয়া যায় নি ।
নগেন্দ্র রাও

42

আমি মনে করি না আপনি (প্রতিবিম্ব ছাড়াই) পারবেন না, আপনার ফাংশনেও একটি প্রকার সরবরাহ করা উচিত:

void MyMethod(Object obj, Type t)
{
    var convertedObject = Convert.ChangeType(obj, t);
    ...
}

ইউপিডি :

এটি আপনার পক্ষে কাজ করতে পারে:

void MyMethod(Object obj)
{
    if (obj is A)
    {
        A a = obj as A;
        ...
    } 
    else if (obj is B)
    {
        B b = obj as B;
        ...
    }
}

4
এটি সত্যই একটি অকেজো উত্তর, আপ-ভোটের অযোগ্য। টাইপ অবজেক্টের কোনও অবজেক্টের প্রতিবিম্ব অপ্টের "প্রকৃত প্রকার" উপস্থাপন করবে না, যেমন ও.পি. এছাড়াও, আপনার মাইমাথোড যুক্তি ত্রুটিযুক্ত কারণ اعتراضটি টাইপ এ এর ​​টাইপ হতে পারে এবং এটি বি টাইপেরও হতে পারে আপনার যুক্তিটি "আসল টাইপ" সরবরাহ করে না (যেমন ওপি অনুরোধ করেছে) - এটি একটি সামঞ্জস্যপূর্ণ টাইপ সরবরাহ করে, এবং অগত্যা নয় যে কাঙ্ক্ষিত টাইপ।
জাজিমভ

obj.GetType () ব্যবহার করুন। এটি অবশ্যই আসল প্রকারে ফিরে আসবে।
JSON

3

কীভাবে জসনকনভার্ট.ডিজারিওলাইজ অবজেক্ট (অবজেক্ট.টোস্ট্রিং ());


এটি সন্তোষজনক উত্তর নয়। ওসির প্রশ্নের জেসন বা সিরিয়ালাইজেশনের কোনও সম্পর্ক নেই।

@ ব্যবহারকারী 12637955 এটি আসলে একটি কার্যকরী উত্তর, তবে বক্সিং এবং আনবক্সিংয়ের কারণে, যেমন বস্তু -> টুস্ট্রিং () -> কংক্রিটের ধরণের কাছে এটি বড় জটিলতা রয়েছে। আরও নির্ভুল হওয়ার জন্য এটি দেখতে এটির মতো হওয়া উচিত:var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
কোক

1

আমার ক্ষেত্রে অটোম্যাপার ভাল কাজ করে।

অটোম্যাপার কোনও স্পষ্ট কনফিগারেশন ছাড়াই ডায়নামিক অবজেক্টগুলিতে / থেকে ম্যাপ করতে পারে:

public class Foo {
    public int Bar { get; set; }
    public int Baz { get; set; }
}
dynamic foo = new MyDynamicObject();
foo.Bar = 5;
foo.Baz = 6;

Mapper.Initialize(cfg => {});

var result = Mapper.Map<Foo>(foo);
result.Bar.ShouldEqual(5);
result.Baz.ShouldEqual(6);

dynamic foo2 = Mapper.Map<MyDynamicObject>(result);
foo2.Bar.ShouldEqual(5);
foo2.Baz.ShouldEqual(6);

একইভাবে আপনি অভিধান থেকে সরাসরি অবজেক্টে ম্যাপ করতে পারেন, অটোম্যাপার কীগুলির সাথে সম্পত্তির নাম যুক্ত করবে।

আরও তথ্য https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping


1

এই পদ্ধতিটি সবচেয়ে দক্ষ নাও হতে পারে তবে সহজ এবং কাজটি করে।

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

public T Format<T>(Object obj) =>
    JsonConvert.DeserializeObject<T>(obj.ToString());

আপনার উত্তরটি ভবিষ্যতের পাঠকদের জন্য সংক্ষেপে বর্ণনা করা উচিত should
সুরজ কুমার

0

যদি আপনার MyFunction()পদ্ধতিটি কেবলমাত্র একটি শ্রেণিতে (এবং এর বংশধর) সংজ্ঞায়িত করা হয় তবে চেষ্টা করুন

void MyMethod(Object obj) 
{
    var o = obj as MyClass;
    if (o != null)
        o.MyFunction();
}

আপনি কল করতে চান এমন ফাংশনটি সংজ্ঞায়িত করে আপনার যদি সম্পর্কিত না থাকা ক্লাসগুলিতে একটি বিশাল সংখ্যা থাকে তবে আপনার একটি ইন্টারফেস সংজ্ঞায়িত করা উচিত এবং আপনার ক্লাসগুলি সেই ইন্টারফেসটিকে সংজ্ঞায়িত করুন:

interface IMyInterface
{
    void MyFunction();
}

void MyMethod(Object obj) 
{
    var o = obj as IMyInterface;
    if (o != null)
        o.MyFunction();
}

0

এটির প্রকৃত প্রকারে কাস্ট করুন যদি আপনি এখন উদাহরণস্বরূপ টাইপ করেন তবে এটি নামক শ্রেণীর নাম থেকে শ্রেণিবদ্ধ। আপনি আপনার ফাংশনটি এভাবে কল করতে পারেন:

(abc)(obj)).MyFunction();

আপনি যদি ফাংশনটি জানেন না তবে এটি অন্যরকমভাবে করা যেতে পারে। সবসময় সহজ নয়। তবে আপনি এটি স্বাক্ষর দ্বারা কোনও উপায়ে খুঁজে পেতে পারেন। যদি এটি আপনার ক্ষেত্রে হয় তবে আপনার আমাদের জানান।


-1

প্রকৃত প্রকারে কাস্ট করা সহজ:

void MyMethod(Object obj) {
    ActualType actualyType = (ActualType)obj;
}

8
এটি অযৌক্তিক। আপনি প্রকৃত প্রকারটি জানেন না। আপনি কিভাবে এটি অনুমিত হয়?
অ্যালেন লিনাটোক

-2
Implement an interface to call your function in your method
interface IMyInterface
{
 void MyinterfaceMethod();
}

IMyInterface MyObj = obj as IMyInterface;
if ( MyObj != null)
{
MyMethod(IMyInterface MyObj );
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.