গতিশীল একটি প্রকল্প রেফারেন্স থেকে সম্পত্তি জন্য একটি সংজ্ঞা থাকে না


96

আমি একটি ত্রুটি পাচ্ছি যা বলছে:

'অবজেক্ট' এর মধ্যে 'শিরোনাম' এর সংজ্ঞা নেই

সমস্ত কোডও গিথুবে রয়েছে

আমার কাছে এমন দেখতে একটি কনসোল অ্যাপ্লিকেশন 1 রয়েছে

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Movie m = new Movie();
            var o = new { Title = "Ghostbusters", Rating = "PG" };
            Console.WriteLine(m.PrintMovie(o));
        }
    }
} 

এবং মুভি.সি

public class Movie : DynamicObject
{
    public string PrintMovie(dynamic o)
    {
        return string.Format("Title={0} Rating={1}", o.Title, o.Rating);
    }
} 

এটি একই প্রকল্প থেকে সূক্ষ্মভাবে কাজ করে, তবে আমি যদি কনসোল অ্যাপ্লিকেশন 1 এর সাথে একটি কনসোল অ্যাপ্লিকেশন 2 যুক্ত করে এবং ঠিক একই কোড যুক্ত করি

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Movie m = new Movie();
            var o = new { Title = "Ghostbusters", Rating = "PG" };
            Console.WriteLine(m.PrintMovie(o));
        }
    }
}

আমি একটি ত্রুটি পেয়েছি:

'অবজেক্ট' এর 'শিরোনাম' ** এর সংজ্ঞা নেই

যদিও এটি গতিশীল অবজেক্টে রয়েছে।

  • o.Title 'o.Title' টাইপটির একটি ব্যতিক্রম ছুঁড়ে ফেলেছে 'Microsoft.CSharp.Runটাইমবাইন্ডার.রুনটাইমবাইন্ডার এক্সসেপশন' গতিশীল {Microsoft.CSharp.Runটাইমবাইন্ডার.রুনটাইমবাইন্ডার এক্সেপশন}

এখানে একটি স্ক্রিন শট হয়: এখানে চিত্র বর্ণনা লিখুন

আমি এই জাতীয় কিছু করছি এবং একটি পরীক্ষা প্রকল্প থেকে মুভি ফাংশন কল করার চেষ্টা করছি।


উত্তর:


82

আপনার একটি ExpandoObject ব্যবহার করা প্রয়োজন

 dynamic o = new ExpandoObject();
 o.Title = "Ghostbusters";
 o.Rating = "PG";

 Console.WriteLine(m.PrintMovie(o));

29
তিনি একটি বিস্তৃত প্রশ্ন লেখার জন্য অনেক সমস্যায়
পড়েছিলেন

4
মনে হচ্ছে না আপনি প্রসারিত অবজেক্টের সাথে ইনলাইন আরম্ভকারী কার্যকারিতা ব্যবহার করতে পারবেন?
রবার্তো বনিনি 16

4
ExpandoObject কোথায় ব্যবহার করা উচিত? একটি গতিশীল অবজেক্ট তৈরি করার জন্য বা ডায়নামিক অবজেক্ট পার্স করার জন্য?
হোসেইন আকাশানী

রবার্টের উত্তর সহায়ক বলে আমাকে আরও তথ্যের সন্ধান করতে হয়েছিল তবে আমার আরও গভীর বোঝাপড়া দরকার ছিল। ওরিলির
বিলি উইলবি

141

আপনারা ত্রুটি কেন পেয়েছেন তা জাহমালের উত্তর বলে না । কারণ হ'ল অজ্ঞাতনামা শ্রেণীটি internalসমাবেশে। কীওয়ার্ড dynamicআপনাকে সদস্যের দৃশ্যমানতা বাইপাস করতে দেয় না।

সমাধানটি হ'ল নামবিহীন ক্লাসের সাথে বেনামে শ্রেণীর প্রতিস্থাপন করা।

কারণ এবং আরও একটি সম্ভাব্য সমাধান ব্যাখ্যা করার জন্য এখানে আরও একটি ভাল উদাহরণ ।

কলটি data2.Personব্যর্থ হওয়ার কারণটি হ'ল টাইম সম্পর্কিত তথ্য data2রানটাইমে পাওয়া যায় না। এটি উপলভ্য না হওয়ার কারণ হ'ল বেনামে প্রকারগুলি সর্বজনীন নয়। পদ্ধতিটি যখন সেই বেনামি ধরণের কোনও উদাহরণ ফিরিয়ে দিচ্ছে, তখন এটি এমন একটি System.Objecটি ফিরিয়ে দিচ্ছে যা কোনও বেনামি ধরণের উদাহরণকে উল্লেখ করে - এমন একটি প্রকার যাঁর তথ্য মূল প্রোগ্রামে উপলভ্য নয়। গতিশীল রানটাইম Personবস্তুটিতে ডাকা একটি সম্পত্তি সন্ধান করার চেষ্টা করে তবে এটি যে ধরণের তথ্য রয়েছে তা থেকে এটি সমাধান করতে পারে না। যেমনটি, এটি একটি ব্যতিক্রম ছোঁড়ে। কলটি data.Nameসুনির্দিষ্টভাবে কাজ করা যেহেতু Personএকটি সর্বজনীন শ্রেণি, সেই তথ্য উপলব্ধ এবং সহজেই সমাধান করা যেতে পারে।

এটি নিম্নলিখিত যে কোনও ক্ষেত্রে আপনাকে প্রভাবিত করতে পারে (যদি না আরও থাকে):

  1. ব্যবহার করে আপনি একটি অ-সার্বজনিক, অ-অভ্যন্তরীণ টাইপ ফিরে করছি System.Object। ২. আপনি পাবলিক বেইস টাইপের মাধ্যমে একটি অ-সর্বজনীন, অভ্যন্তরীণ অভ্যন্তরীণ উত্পন্ন প্রকারটি ফিরিয়ে দিচ্ছেন এবং বেস ধরণের নয় এমন উদ্ভূত প্রকারে কোনও সম্পত্তি অ্যাক্সেস করছেন। ৩. আপনি কোনও আলাদা সমাবেশ থেকে বেনামে টাইপের ভিতরে মোড়ানো কোনও কিছু ফিরিয়ে দিচ্ছেন।

4
দয়া করে আপনার উত্তরে আপনার উত্সটি উদ্ধৃত করতে পারেন?
d3dave

4
@ d3dave উত্তরের দুটি দাবি পরীক্ষা করা যেতে পারে। শ্রেণীর দৃশ্যমানতা। নেট ডেকম্পেলারে চেক করা যায়। অ্যাক্সেসের নিয়মগুলি dynamicবিভিন্ন শ্রেণীর দৃশ্যমানতার সদস্যদের সাথে একটি পরীক্ষার শ্রেণিতে পরীক্ষা করা যায়।
রবার্ট ভান

4
ওপি যা করছিল তা এই সমস্যাটির আসল উত্তর।
ম্যাটি ভির্ককুনেন

4
আমি এটি উত্স এবং পরীক্ষার প্রকল্পের মধ্যে কাজ করতে পারি না যা নেটকোর্যাপ ১.১ উভয়ই। কোনও ধারণা যদি এটি কেবল আমার দোষ হয় বা এটি। নেট কোর কাজ করে না?
অ্যান্টনি মাস্ট্রিয়ান

29

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

[assembly:InternalsVisibleTo("MyDataLayerAssemblyName")]

এবং এটি এটি সমাধান।

উদাহরণ:

using System.Runtime.CompilerServices;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[assembly: InternalsVisibleTo( "MyDataLayerAssembly" )]
namespace MyUnitTestProject.DataTests
{

   [TestClass]
   public class ContactTests
   {
      ...

তথ্যসূত্র:


4
কারণটি যা বলেছেন আলেকজান্ডার স্টেপানিয়ুক। আপনার মন্তব্য সমাধান। ধন্যবাদ!
প্যাটো লোকো

আমি এটি নেটকোর অ্যাপ ১.১ প্রকল্পের মধ্যে কাজ করতে পারি না, নিশ্চিত না যে এটি কোনওরকমভাবে ভুল করছি doing
অ্যান্টনি মাস্ট্রিয়ান

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

নোট করুন যে আপনার (বিকাশকারী) এটিকে বিপরীত প্রকল্পে যুক্ত করতে হবে যা থেকে বেনামে প্রকারগুলি তৈরি করা হচ্ছে, বা উভয়ই যদি তা হয় তবে।
ryanwebjackson

1

আমার ক্ষেত্রে আমার এক্স ইউনাইট পরীক্ষা প্রকল্প রয়েছে।

যেখানে 'বিষয়বস্তু' একটি জাসন স্ট্রিং

এই কোড ত্রুটি ছুড়ে:

dynamic parsed = JsonConvert.DeserializeObject<dynamic>(content);

এই কোডটি কাজ করে। ডায়নামিকের মতো এক্সপেন্ডোঅবজেক্ট ইনসটেড ব্যবহার করুন :

dynamic parsed = JsonConvert.DeserializeObject<ExpandoObject>(content);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.