কেন সদস্যগুলি অসঙ্গতভাবে কাজ করে?

একটি নির্দিষ্ট সংকলন মধ্যে ধরনের একটি সংগ্রহ প্রাপ্ত করার চেষ্টা করার সময়, আমি সমস্যাটি যাও উপায় কোন ভাবেই উপায় হিসাবে নিজেকে সব বিভ্রান্ত করেছি। মূলত, ফলাফল প্রত্যাশিত মনে হবে যে পদ্ধতি না, এবং ভাইস-বিপরীত। নীচে একটি ডিবাগ সেশনের তাত্ক্ষণিক উইন্ডো থেকে আউটপুট রয়েছে, যেখানে অ্যাপসংযোগ হল প্রকারের সংকলন </কোড> (natch)।

**appCompilation.GlobalNamespace.GetMembers()**
Count = 14
    [0]: "Namespace Registration"
    [1]: "Namespace Payments"
    [2]: "Namespace Foo"
    [3]: "NamedType "
    [4]: "NamedType "
    [5]: "NamedType "
    [6]: "NamedType "
    [7]: "NamedType "
    [8]: "NamedType "
    [9]: "NamedType "
    [10]: "Namespace Conference"
    [11]: "Namespace System"
    [12]: "NamedType <>f__AnonymousType0<j__TPar>"
    [13]: "Namespace Infrastructure"
**appCompilation.GlobalNamespace.GetTypeMembers()**
{System.Linq.Enumerable.OfTypeIterator}
    source: null
**appCompilation.GlobalNamespace.GetNamespaceMembers()**
{System.Linq.Enumerable.OfTypeIterator}
    source: null

তাই আমার প্রশ্ন হল এটি: যখন আমি গেট টাইম ম্যামবার্স() ধরনের == নামস্থান এর একটি প্রতীককে কল করি, তখন আমি নল পাই। আমি যখন কল করি তখন একই চিহ্নের জন্য GETNamespaceMembers() নাম্বার দিন। তবুও, আমি যখন কল করি তখন জিমেইলার্স() নামপেস এবং প্রকারের সামগ্রীর পান!

এখনও Weirder, আমি একটি বিবৃতি উইন্ডোতে এই বিবৃতি স্থাপন এবং অ খালি, নন ফলাফল পেতে পারেন!

অ্যাপ্লিকেশনসংযোগ। গ্লোবালনামপ্রেস.নেট নামস্থানযুক্তসম্পাদনা (), ফলাফল </কোড>

সম্ভবত প্রাসঙ্গিক: আমি আশা করি যখন একটি ক্যোয়ারী execution শুরু করা হবে না মনে হয়, কিন্তু আমি যে কিভাবে বা এমনকি কেন আমার সম্পর্কে যে চিন্তা করতে হবে কিভাবে সম্পূর্ণ না নিশ্চিত ... কল <�। কোড>। তালিকার() </কোড> কখনও কখনও মৃত্যুদন্ড কার্যকর করা হবে। আমি মনে করতাম যে যদিও অনেকগুলি পদ্ধতি একটি বাতিলকরণের প্যারামিটার প্রদান করে, তখন তারা সবগুলি সিঙ্ক্রোনাস চালায় একটি সমস্যাও হল যে বিভিন্ন GetXXX() পদ্ধতিগুলি ReadOnlyArray বা IEnumerable ফিরে আসে; লিনাক্স এক্সটেনশান পদ্ধতি থেকে একই আচরণ বাছাই বলে মনে হয় না।

Judging from a surface scan of debugging output, it looks like GetTypeMembers and its' ilk wrap GetMembers() with an .OfType<> call. Maybe it's in that translation things are getting borked?

যেকোন হারে, অ্যাক্সেস এবং এক্সিকিউটিভ ক্যোয়ারীগুলির অসঙ্গতি বেশ বেদনাদায়ক হয়েছে, তাই আমি আশা করছি যে কেউ আমাকে বুঝতে সাহায্য করবে যে আমি যা অনুভব করছি তা হচ্ছে জিনিসগুলি অনির্ধারিতভাবে মনে হচ্ছে।

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

চূড়ান্ত পাসিং ক্যোয়ারী নমুনা যেটি একটি নির্দিষ্ট সংকলন থেকে সব ধরনের জিনিস উদ্ধার করে, তিনটি নেমস্পেস নেস্টিংস বা এমন স্তরের স্তরের (এই ক্ষেত্রে আবরণগুলির জন্য আরও পরীক্ষার প্রয়োজন):

এই থেকে (এবং এটি অন্য কিছু প্রচেষ্টা তুলনায় অনেক ভালো!)

appCompilation.Assembly.GlobalNamespace.GetNamespaceMembers()
    .SelectMany(x => x.GetNamespaceMembers().Select(y => y.GetNamespaceMembers()))
    .SelectMany(x => x, (symbols, symbol) => symbol.GetTypeMembers())
    .SelectMany(x => x);

এই (এখনও পুরোপুরি recursive না, কিন্তু এখন জন্য যথেষ্ট ভাল):

from glob in appCompilation.Assembly.GlobalNamespace
    .GetMembers()
    .OfType()
from childNs in glob
    .GetMembers()
    .OfType()
from childTypes in childNs
    .GetTypeMembers()
select childTypes;
0
যোগ সম্পাদিত
মতামত: 1
পরীক্ষার ব্যর্থতার পরেই আমি অবিলম্বে উইন্ডোতে যে বিবৃতিটি দৌড়েছিলাম, সেটি ব্যর্থতার কারণেই ব্রেকপয়েন্ট এবং ডিবাগ করাতে :)
যোগ লেখক Josh E, উৎস
FWIW, nCrunch ব্যবহার করে একটি ব্যর্থ পরীক্ষা নিরীক্ষণ প্রকৃতপক্ষে তা অবিলম্বে উইন্ডো ব্যবহার করে একটি পুনরাবৃত্ত অভিজ্ঞতা দূরে না!
যোগ লেখক Josh E, উৎস
এটি শুধু তাত্ক্ষণিক উইন্ডোতে সমস্যা নয়? যদি আপনি আসলে foreach ব্যবহার করে ফলাফল গণনা করার চেষ্টা করেন তাহলে কি হবে?
যোগ লেখক svick, উৎস

1 উত্তর

আমি মনে করি এই শুধুমাত্র একটি সীমাবদ্ধতা সঙ্গে সামঞ্জস্যপূর্ণ উইন্ডো, Roslyn সম্পর্কিত না।

উদাহরণস্বরূপ নিম্নোক্ত কোড সহ:

var ints = new object[] { 2 }.OfType();

আমি অবিলম্বে উইন্ডোতে এই আউটপুট পেতে:

ints
{System.Linq.Enumerable.OfTypeIterator}
    source: null
    System.Collections.Generic.IEnumerator<tresult>.Current: 0
    System.Collections.IEnumerator.Current: 0

কিন্তু যদি আমি foreach ব্যবহার করে সংগ্রহটি পুনরাবৃত্তি করি বা দেখুন ঘড়ি উইন্ডোতে ফলাফল দেখুন, এটি সঠিকভাবে কাজ করে

The reason you see what you do is because Enumerable.OfType() is written using an iterator block, which generates the iterator type. The iterator type has some fields with unspeakable names, including <>3__source which holds the original source (the array in my example). It also has one field with a normal name: source, which is set in the call to GetEnumerator(). Since you didn't call that method yet, source is null.

2
যোগ
এটা সম্ভাব্য যে আমি আমার আসল সমস্যার গোপন উইন্ডোতে নতুনদের সাথে লুকিয়ে আছি। আমি ব্যর্থ পোস্টের কোডটি আমার পোস্টে সংশোধন করব
যোগ লেখক Josh E, উৎস
PEBKAC! আপনি সঠিক ছিল - তাত্ক্ষণিক উইন্ডো এটি figuring উপায় হিসাবে পেয়ে ছিল। একবার আমি আমার বিশ্বাসগুলিকে বিশ্বাস করার জন্য যথেষ্ট পরিমাণে আমার পরীক্ষাগুলি সহজ করে দিয়েছিলাম, তখন আমি সমাধানটি পুনরাবৃত্তি করতে সক্ষম হয়েছিলাম
যোগ লেখক Josh E, উৎস