डायनेमिक में प्रोजेक्ट संदर्भ से प्रॉपर्टी की परिभाषा नहीं होती है


93

मुझे एक त्रुटि मिल रही है जो कहती है:

'ऑब्जेक्ट' में 'शीर्षक' की परिभाषा नहीं है

सभी कोड भी जीथब पर है

मेरे पास एक ConsoleApplication1 है जो इस तरह दिखता है

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);
    }
} 

यह SAME प्रोजेक्ट से ठीक काम करता है, लेकिन अगर मैं ConsoleApplication2 को ConsoleApplication1 के संदर्भ में जोड़ता हूं और सटीक समान कोड जोड़ता हूं

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.RuntimeBinder.RuntimeBinderException' डायनामिक {Microsoft.CSharp.RuntimeBinder।

यहाँ एक स्क्रीन शॉट है: यहाँ छवि विवरण दर्ज करें

मैं ऐसा कुछ कर रहा हूं और एक परीक्षण परियोजना से फिल्म समारोह को कॉल करने की कोशिश कर रहा हूं।


जवाबों:


79

आपको एक ExpandoObject का उपयोग करने की आवश्यकता है

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

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

28
वह एक विस्तृत प्रश्न लिखने के लिए बहुत परेशानी से गुज़रा, यह जानकर उसे अच्छा लगा होगा कि उसे त्रुटि क्यों हो रही है, जैसा कि रॉबर्ट ने सुझाव दिया है
लुइस फेरो

2
ऐसा नहीं लगता कि आप एक्सपेंडेओ ऑब्जेक्ट के साथ इनलाइन इनिशलाइज़र कार्यक्षमता का उपयोग कर सकते हैं?
रॉबर्टो बोनीनी

1
एक्सपेंडीओबजेक्ट का उपयोग कहां करना चाहिए? गतिशील वस्तु बनाने के लिए या गतिशील वस्तु को पार्स करने के लिए?
होसिन अकाजानी

मुझे अधिक जानकारी की तलाश करनी थी क्योंकि रॉबर्ट का उत्तर सहायक था लेकिन मुझे गहरी समझ की आवश्यकता थी। ओरीली ने डायनामिक प्रकारों पर एक अच्छा लेख यहां दिया था: अजवायन
बिली विलोबी

139

जयमल का जवाब यह नहीं कहता कि आपको त्रुटि क्यों मिली। कारण यह है कि अनाम वर्ग internalविधानसभा के लिए है। कीवर्ड dynamicआपको सदस्य दृश्यता को बायपास करने की अनुमति नहीं देता है।

इसका समाधान अनाम वर्ग को नामांकित सार्वजनिक वर्ग से प्रतिस्थापित करना है।

यहाँ एक और अच्छा उदाहरण है जो कारण और दूसरा संभावित समाधान बताते हैं

कॉल data2.Personविफल होने का कारण यह है कि data2रनटाइम के प्रकार की जानकारी उपलब्ध नहीं है। इसका कारण उपलब्ध नहीं है क्योंकि अनाम प्रकार सार्वजनिक नहीं हैं। जब विधि उस अनाम प्रकार की आवृत्ति लौटा रही है, तो वह एक System.Object लौटा रहा है जो एक अनाम प्रकार का उदाहरण देता है - एक प्रकार जिसका जानकारी मुख्य कार्यक्रम के लिए उपलब्ध नहीं है। डायनेमिक रनटाइम Personऑब्जेक्ट पर कॉल की गई प्रॉपर्टी को खोजने की कोशिश करता है , लेकिन इसे टाइप की गई जानकारी से हल नहीं कर सकता। जैसे, यह एक अपवाद फेंकता है। कॉल करने के लिए data.Nameकाम करता है ठीक बाद से Personएक सार्वजनिक वर्ग है, कि जानकारी उपलब्ध है और आसानी से हल किया जा सकता।

यह आपको निम्नलिखित मामलों में से किसी में भी प्रभावित कर सकता है (यदि अधिक नहीं):

  1. आप एक गैर-सार्वजनिक, गैर-आंतरिक प्रकार का उपयोग करके लौट रहे हैं System.Object। 2. आप एक सार्वजनिक आधार प्रकार के माध्यम से एक गैर-सार्वजनिक, गैर-आंतरिक व्युत्पन्न प्रकार लौट रहे हैं और एक संपत्ति को उस प्रकार से एक्सेस कर रहे हैं जो आधार प्रकार में नहीं है। 3. आप एक अलग विधानसभा से एक गुमनाम प्रकार के अंदर लिपटे कुछ भी वापस कर रहे हैं।

1
क्या आप अपने जवाब में अपने स्रोत का हवाला दे सकते हैं?
d3dave

@ d3dave उत्तर में दो दावों का परीक्षण किया जा सकता है। .NET डेसकॉम्पेलर में क्लास विजिबिलिटी चेक की जा सकती है। dynamicअलग-अलग दृश्यता वाले सदस्यों के साथ टेस्ट क्लास के लिए एक्सेस नियमों की जाँच की जा सकती है।
रॉबर्ट वॉन

3
यह वास्तविक उत्तर है कि ओपी क्यों कर रहा था एक समस्या है।
मैटी विर्ककुनेन

1
मुझे यह एक स्रोत और परीक्षण परियोजना के बीच काम करने के लिए नहीं मिल सकता है जो दोनों netcoreapp1.1 हैं। किसी भी विचार अगर यह सिर्फ मेरी गलती है या अगर यह .NET कोर में काम नहीं करता है?
एंथनी मास्टरीएन

29

मेरे मामले में मेरे पास एक यूनिट टेस्ट प्रोजेक्ट था जो मैंने विजुअल स्टूडियो और कई मामलों में बनाया था जहां मुझे डेटा लेयर लाइब्रेरी पर तरीकों का परीक्षण करने की आवश्यकता थी। मैं उन सभी को बदलना नहीं चाहता था, इसलिए मैंने परीक्षण सभा को मित्र के रूप में चिह्नित करके उपयोग किया:

[assembly:InternalsVisibleTo("MyDataLayerAssemblyName")]

और वह हल हो गया।

उदाहरण:

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

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

   [TestClass]
   public class ContactTests
   {
      ...

संदर्भ:


1
इसका कारण अलेक्जेंडर स्टेपनिउक ने कहा है। आपकी टिप्पणी समाधान है। धन्यवाद!
पाटो लोको

मैं netcoreapp1.1 परियोजनाओं के बीच काम करने के लिए इसे प्राप्त नहीं कर सकता, निश्चित नहीं कि अगर यह कुछ ऐसा है जो मैं गलत तरीके से कर रहा हूं।
एंथनी मास्टरीएन

विशाल धन्यवाद जेलगाब! अब मुझे ExpanoObject के साथ डायनामिक को बदलना नहीं है! मैं अपनी इकाई परीक्षणों में निर्भरता इंजेक्शन का उपयोग कर रहा हूं और मैं गतिशील का उपयोग करने में असमर्थ था और यह इकाई परीक्षण परियोजना से काम करता है। लेकिन इससे यह हल हो गया!
शामवेरे

ध्यान दें कि आपको (डेवलपर) इसे विपरीत परियोजना में जोड़ना होगा जहां से अनाम प्रकार बनाए जा रहे हैं, या दोनों, यदि यह मामला है।
ryanwebjackson

0

मेरे मामले में मेरे पास एक xUnit परीक्षण परियोजना है।

जहां Where कंटेंट ’एक जोंस स्ट्रिंग है

यह कोड त्रुटि फेंकता है:

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

यह कोड काम करता है। इस तरह से डायनेमिक के InstoObject इंस्टेंट का उपयोग करें :

dynamic parsed = JsonConvert.DeserializeObject<ExpandoObject>(content);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.