2013-11-01 7 views
8

पृष्ठभूमि"निजी" दृश्यता संशोधक - सी # से वीबी में परिवर्तित करते समय मतभेदों को कैसे संभालें?

मैं सी # कनवर्टर DeveloperFusion.com में पाया का उपयोग कर VB.net कोड में नीचे दिए गए कोड (TreeViewAdv फ़ाइल TreeColumn.cs में पाया) परिवर्तित कर दिया है।

सी #

using System; 
//...(other using calls) 

namespace Aga.Controls.Tree 
{ 
    [TypeConverter(typeof(TreeColumn.TreeColumnConverter)), DesignTimeVisible(false), ToolboxItem(false)] 
    public class TreeColumn : Component 
    { 
     private class TreeColumnConverter : ComponentConverter 
     { 
      public TreeColumnConverter() 
       : base(typeof(TreeColumn)) 
      { 
      } 

      public override bool GetPropertiesSupported(ITypeDescriptorContext context) 
      { 
       return false; 
      } 
     } 
    } 
    //…Some, I believe, unrelated code 
} 

वीबी

Imports System.Collections.Generic 
‘...(other Imports calls) 

Namespace Aga.Controls.Tree 

    <TypeConverter(GetType(TreeColumn.TreeColumnConverter)), DesignTimeVisible(False), ToolboxItem(False)> _ 
    Public Class TreeColumn 
     Inherits Component 

     Private Class TreeColumnConverter 
      Inherits ComponentConverter 

      Public Sub New() 
       MyBase.New(GetType(TreeColumn)) 
      End Sub 

      Public Overrides Function GetPropertiesSupported(ByVal context As ITypeDescriptorContext) As Boolean 
       Return False 
      End Function 
     End Class 
    ‘...some, I believe, unrelated code 
End Class 

समस्या

सी # कोड की इस पंक्ति में TreeColumn.TreeColumnConverter तक पहुंच ठीक है। [TypeConverter (typeof (TreeColumn.TreeColumnConverter)), DesignTimeVisible (गलत), ToolboxItem (गलत)]

हालांकि, VB.Net परिवर्तित लाइन में है कि सदस्य के लिए उपयोग की अनुमति नहीं है:

त्रुटि वर्णन पढ़ता है: Aga.Controls.Tree.TreeColumn.TreeColumnConverter' is not accessible in this context because it is 'Private'। हालांकि, दोनों मामलों में TreeColumn.TreeColumnConverter निजी घोषित किया गया है।

प्रश्न (रों)

1.) क्यों। चूंकि यह मेरे लिए एक सीखने का प्रोजेक्ट है, मैं जानना चाहता हूं कि क्यों दो भाषाओं में स्कॉप्स अलग-अलग काम कर रहे हैं। उनमें से 2 के बीच यह एक और महत्वपूर्ण सवाल है।

2.) कैसे। वीबी कोड को बदलने के लिए सबसे अच्छा तरीका क्या है ताकि TreeColumnConverter को उस बिंदु तक खुलने के बिना कोड की पहचान की गई लाइन तक पहुंचने की इजाजत दी जा सके, जिससे संभावित रूप से नामकरण भ्रम पैदा हो जाए? मैं इसे सार्वजनिक घोषित कर सकता हूं, लेकिन मुझे लगता है कि इसके लिए एक और सही दृष्टिकोण है।

ध्यान रखने योग्य बातें करने के लिए जब

1. उत्तर देना) मुझे पता है कि VB.net में निजी सदस्यों वस्तु जिसमें वे घोषित किया गया करने के लिए बाहरी उपलब्ध नहीं हैं। तो मुझे यह बताएं कि यह सहायक नहीं होगा और मेरे दिमाग में कोई जवाब नहीं है।

+0

कि स्पष्ट मेरे लिए यह एक विशाल जवाब की आवश्यकता क्यों है। बस इसे निजी से मित्र में बदलें। वीबी.नेट एक दोस्ताना भाषा है। –

+0

@ हंसपैसेंट आपको इसे एक उत्तर के रूप में पोस्ट करना चाहिए, जबकि आपने मुझे क्यों नहीं दिया, यह एक वैध तरीका है। जॉर्डो का जवाब भी एक मान्य है। यदि आप मुझे विश्वास दिला सकते हैं कि आपकी पद्धति बेहतर है तो मैं आपको 'स्वीकृत उत्तर' दूंगा। – ProtoNoob

उत्तर

5

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

वैसे भी, VB.NET में इसे ठीक कर आप TypeConverterAttribute निर्माता एक Type के बजाय एक स्ट्रिंग का उपयोग करता है इस्तेमाल कर सकते हैं, और एक स्ट्रिंग के रूप में पूरी तरह से योग्य नेस्टेड प्रकार का नाम डाल करने के लिए:

<TypeConverter("Aga.Controls.Tree.TreeColumn.TreeColumnConverter"), DesignTimeVisible(False), ToolboxItem(False)> _ 
Public Class TreeColumn 
    ... 
नहीं
+0

टाइपकॉन्टर विशेषता पर थोड़ा अधिक शोध करने के बाद, जानकारी के लिए धन्यवाद, यह एक वैध फिक्स की तरह दिखता है, लेकिन हंस पासेंट भी एक अच्छा बिंदु बनाता है। क्या आपके दिमाग में फायदे हैं, जिसके लिए बेहतर होगा? मैं शायद उस चर्चा पर जवाब दूंगा। – ProtoNoob

+0

आप इसे 'मित्र' ('सी # में आंतरिक') बनाकर नेस्टेड प्रकार की पहुंच को बदल देंगे। इसे उसी असेंबली में किसी अन्य प्रकार से एक्सेस किया जा सकता है। –

+0

सच है, और वास्तव में यह मेरी मूल चिंता थी, लेकिन मैं वहां स्थिरता का उपयोग करने के बारे में सतर्क हूं। क्या यह मानने का कोई कारण है कि GetType (TreeColumn.TreeColumnConverter) प्रत्येक "Aga.Controls.Tree.TreeColumn.TreeColumnConverter" के अलावा किसी अन्य मूल्य को वापस लाएगा? मुझे नहीं लगता, लेकिन यह मेरा कोड नहीं है और मैं अभी तक सभी पद्धतियों को समझ नहीं पा रहा हूं (लेकिन मैं सीखने की कोशिश कर रहा हूं)। – ProtoNoob

0

आह, मेरा मानना ​​है कि मैं आपकी समस्या को देखते हैं।

यह नामस्थान है।

VB.NET चेन नेमस्पेस।

Namespace Aga.Controls.Tree vb.net में वास्तव में आपके प्रोजेक्ट का डिफ़ॉल्ट नेमस्पेस फ़ाइल में घोषित नामस्थान के साथ सम्मिलित होगा।

यह वास्तव में Aga.Controls.Tree.Aga.Controls.Tree होगा, इसलिए संभवतः यह उस दायरे तक नहीं पहुंच सकता है क्योंकि यह गलत नामस्थान को इंगित कर रहा है।

सी #, आप नामस्थानों को पूरी तरह अर्हता प्राप्त करते हैं ... देवफ्यूजन का कनवर्टर (शार्प डेवलपमेंट आईडीई में उपयोग किए जाने वाले जैसा ही) इसे नहीं जानता है।

+0

क्या आपको यकीन है कि यह मुद्दा है? या तुमने कोशिश की? –

+0

क्या मुझे यकीन है? नहीं ... विजुअल स्टूडियो की हर किसी की कॉन्फ़िगरेशन एक बकवास शूट है। मैं आगे और पीछे VB.NET से सी # परियोजना के लिए दैनिक कूद और जब मैं दूसरे के कन्वर्ट करने के लिए है (आम तौर पर एक ही DLLs देव संलयन का उपयोग करता है का उपयोग करते हुए) मैं हमेशा नामस्थान खुद को श्रृंखलाबद्ध और अजीब से बाहर सब कुछ फेंक में चलाने। मैंने टाइपकॉन्टर का उपयोग किए बिना पहले नेस्टेड निजी फ़ील्ड का उपयोग किया है ... इसलिए मुझे वास्तव में नुकसान हुआ है। –

+0

@Steiner आप कहां परिवर्तित करने के लिए dlls dev fusion उपयोग कर सकते हैं? मैंने अपनी वेबसाइट पर किसी भी प्रकार का लिंक नहीं देखा है और मैं बैच कनवर्टर डेस्कटॉप एप्लिकेशन लिखने पर अपना हाथ आजमा देना चाहता हूं ... अगर उनके पास पहले से कोई नहीं है। – ProtoNoob

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