2012-02-23 8 views
59

मैं एक त्रुटि है कि कहते हैं हो रही है:गतिशील एक परियोजना संदर्भ से एक संपत्ति के लिए एक परिभाषा शामिल नहीं है

'object' does not contain a definition for 'Title'

सभी कोड github

पर भी है मैं एक 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)); 
     } 
    } 
} 

और Movie.cs

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

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

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

जोड़ने मैं एक त्रुटि मिलती है:

'object' does not contain a definition for 'Title'**

भले ही यह गतिशील वस्तु में है।

  • o.Title 'o.Title' प्रकार का एक अपवाद फेंक दिया 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' गतिशील {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}

यहाँ एक स्क्रीन शॉट है: enter image description here

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

+1

संभव डुप्लिकेट: // stackoverflow .com/प्रश्न/2630370/सी-तेज-गतिशील-अज्ञात-प्रकार-घोषित-गुण-गुण-से-अज्ञात-प्रकार-घोषित-इन-एनोट) –

उत्तर

61

आप एक ExpandoObject

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

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

वह एक विस्तृत क्यू लिखने के लिए बहुत सारी परेशानी से गुजर गया स्टियन, यह जानना अच्छा होगा कि उसे त्रुटि क्यों मिल रही है, क्योंकि रॉबर्ट –

+0

सुझाता है ऐसा प्रतीत नहीं होता है कि आप विस्तार ऑब्जेक्ट के साथ इनलाइन प्रारंभकर्ता कार्यक्षमता का उपयोग कर सकते हैं? –

+0

शानदार, यह यूनिट परीक्षण –

90

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

समाधान नामित सार्वजनिक वर्ग के साथ गुमनाम वर्ग को बदलने के लिए है।

यहाँ कारण और another possible solution समझा एक और अच्छा उदाहरण है।

The reason the call to data2.Person fails is that the type information of data2 is not available at runtime. The reason it's not available is because anonymous types are not public. When the method is returning an instance of that anonymous type, it's returning a System.Objec t which references an instance of an anonymous type - a type who's info isn't available to the main program. The dynamic runtime tries to find a property called Person on the object, but can't resolve it from the type information it has. As such, it throws an exception. The call to data.Name works fine since Person is a public class, that information is available and can be easily resolved.

This can affect you in any of the following cases (if not more):

  1. You're returning a non-public, non-internal type using System.Object .
  2. You're returning a non-public, non-internal derived type via a public base type and accessing a property in the derived type that's not in the base type.
  3. You're returning anything wrapped inside an anonymous type from a different assembly.
+0

क्या आप अपने स्रोत में अपने स्रोत का उद्धरण दे सकते हैं, कृपया? – d3dave

+0

@ d3dave उत्तर में दो दावों का परीक्षण किया जा सकता है। .NET decompiler में क्लास दृश्यता की जांच की जा सकती है। 'गतिशील' के लिए प्रवेश नियमों को विभिन्न दृश्यता के सदस्यों के साथ एक परीक्षण कक्षा में चेक किया जा सकता है। –

+1

यह वास्तविक जवाब है कि ओपी क्या कर रहा था एक समस्या है। –

15

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

[विधानसभा: InternalsVisibleTo ("MyDataLayerAssemblyName")]

और वह इसे हल।

उदाहरण:

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

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

    [TestClass] 
    public class ContactTests 
    { 
     ... 

संदर्भ: InternalsVisibleToAttribute Class

Friend Assemblies

(http [सी # 'गतिशील' तक नहीं पहुँच सकता गुमनाम प्रकार एक और विधानसभा में घोषित से गुण] की
+1

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

+0

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

संबंधित मुद्दे