এক্সটেনশন পদ্ধতিগুলি একটি জেনারিক স্ট্যাটিক শ্রেণিতে সংজ্ঞায়িত করতে হবে


213

আমি ত্রুটি পাচ্ছি:

এক্সটেনশন পদ্ধতিগুলি একটি জেনারিক স্ট্যাটিক শ্রেণিতে সংজ্ঞায়িত করতে হবে

লাইনে:

public class LinqHelper

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Linq.Expressions;
using System.Reflection;

/// <summary>
/// Helper methods for link
/// </summary>
public class LinqHelper
{
    public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string property)
    {
        return ApplyOrder<T>(source, property, "OrderBy");
    }
    public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string property)
    {
        return ApplyOrder<T>(source, property, "OrderByDescending");
    }
    public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> source, string property)
    {
        return ApplyOrder<T>(source, property, "ThenBy");
    }
    public static IOrderedQueryable<T> ThenByDescending<T>(this IOrderedQueryable<T> source, string property)
    {
        return ApplyOrder<T>(source, property, "ThenByDescending");
    }
    static IOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> source, string property, string methodName)
    {
        string[] props = property.Split('.');
        Type type = typeof(T);
        ParameterExpression arg = Expression.Parameter(type, "x");
        Expression expr = arg;
        foreach (string prop in props)
        {
            // use reflection (not ComponentModel) to mirror LINQ
            PropertyInfo pi = type.GetProperty(prop);
            expr = Expression.Property(expr, pi);
            type = pi.PropertyType;
        }
        Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type);
        LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);

        object result = typeof(Queryable).GetMethods().Single(
                method => method.Name == methodName
                        && method.IsGenericMethodDefinition
                        && method.GetGenericArguments().Length == 2
                        && method.GetParameters().Length == 2)
                .MakeGenericMethod(typeof(T), type)
                .Invoke(null, new object[] { source, lambda });
        return (IOrderedQueryable<T>)result;
    }
}

উত্তর:


309

পরিবর্তন

public class LinqHelper

প্রতি

public static class LinqHelper

এক্সটেনশন পদ্ধতি তৈরি করার সময় নিম্নলিখিত বিষয়গুলি বিবেচনা করা দরকার:

  1. বর্গ যা সংজ্ঞায়িত করে একটি এক্সটেনশন পদ্ধতি হতে হবে non-generic, staticএবংnon-nested
  2. প্রতিটি এক্সটেনশন পদ্ধতি অবশ্যই একটি staticপদ্ধতি হতে হবে
  3. এক্সটেনশন পদ্ধতির প্রথম প্যারামিটারটিতে thisকীওয়ার্ডটি ব্যবহার করা উচিত ।

আপনি যদি ক্লাসটিকে অ্যাপ_কোডে স্থাপন করেছেন তবে ক্লাস সংজ্ঞায় এটি স্ট্যাটিক কীওয়ার্ড রাখতে বাধ্য, তবে আপনি যদি এটি অন্য কোনও ফোল্ডারে রাখেন তবে এটি সাধারণ শ্রেণি হিসাবে ব্যবহার করার জন্য এটি সূক্ষ্ম।
ডিটি

1
একটি ক্ষেত্রে, আমি ব্যবহার করেছি public static class IQueryable<T> where T : MyBaseClassযা এই ত্রুটিটি উত্পন্ন করে। where T : MyBaseClassফ্রেজ ছাড়া পৃথক পদ্ধতি উপর জন্যে <T>স্ট্যাটিক বর্গ উপর।
ব্রন ডেভিস

1
তবে ক্লাসটি যদি আংশিক হয়? এই সমাধানটি আমার পক্ষে কার্যকর হয়নি।
Fandango68

1
ধন্যবাদ বন্ধু, আমি "এই" পরামিতিটি ধরেছিলাম!
রবার্তো গাটা

1
সাবধানতা অবলম্বন করুন যদি আপনি অযত্নে আপনার ক্লাসকে একটি এক্সটেনশন পদ্ধতিতে (সংকলক অনুসারে) রূপান্তর করেন তবে আপনি এই সংকলকটি পেতে পারেন। দেখুন এই উত্তর স্ট্যাটিক পদ্ধতি শুভেচ্ছা ও এই উত্তর বিষয়ে thisপদ্ধতি আর্গুমেন্ট।
মার্টেন বোদেউয়েস

26

যদি আপনার স্থির ক্রিয়াকলাপের ইচ্ছা না থাকে তবে আর্গুমেন্টের "এই" কীওয়ার্ডটি থেকে মুক্তি পাবেন।


6
আমি ভিজ্যুয়াল স্টুডিও কেন আমার ক্লাসগুলির মধ্যে একটিকে একটি বর্ধিতকরণ পদ্ধতি হিসাবে চেষ্টা করার চেষ্টা করছিলাম তা ভেবে দেখার চেষ্টা করার জন্য আমি কিছুক্ষণের জন্য আমার মাথা আঁচড়ালাম। দেখা যাচ্ছে যে thisআমার পদ্ধতির স্বাক্ষরগুলিতে আমার কাছে একটি কীওয়ার্ড পুঁতে রাখা হয়েছিল। এটি অপসারণ করা ত্রুটিটি সাফ করেছে।
ফাতেমায়ার

20

staticশ্রেণীর ঘোষণায় কীওয়ার্ড যুক্ত করুন :

// this is a non-generic static class
public static class LinqHelper
{
}

16

পরিবর্তনের চেষ্টা করুন

public class LinqHelper

প্রতি

 public static class LinqHelper


15

নাথনের মতো একটি বাগ অভিজ্ঞ লোকদের জন্য একটি কাজের জায়গা:

অন-ফ্লাই সংকলকটি এই এক্সটেনশন পদ্ধতির ত্রুটি নিয়ে সমস্যা বলে মনে হচ্ছে ... যোগ করা staticআমার পক্ষে কোনও সাহায্যই করেনি।

আমি জানাতে চাই যে বাগের কারণ কী?

তবে কাজের ক্ষেত্রটি হ'ল একটি নতুন এক্সটেনশন ক্লাস (নেস্টেড নয়) এমনকি একই ফাইলটিতে লিখতে এবং পুনর্নির্মাণ করা।

এই থ্রেডটি যথেষ্ট পরিমাণে মতামত পেয়েছে যে এটি খুঁজে পেয়েছি (সীমাবদ্ধ) সমাধান পেয়েছি worth বেশিরভাগ লোকেরা সমাধানের জন্য গুগল-ইনগিংয়ের আগে সম্ভবত 'স্ট্যাটিক' যুক্ত করার চেষ্টা করেছিলেন! এবং আমি অন্য কোথাও এই কাজের আশ্বাস ঠিক করতে দেখিনি didn't


আমারো একই ইস্যু ছিল. আমি কেবল বুঝতে পেরেছি যে আমি ক্লাসের মধ্যে একটি স্থির ফাংশন যুক্ত করেছি এবং এটির মন্তব্য করতে ভুলে গেছি। যাতে আমার ক্লাস স্থির করে তোলে, এবং তাই এই ত্রুটি প্রদান করে। আপনার ক্লাসে কোনও স্থির বস্তু আছে কিনা তা পরীক্ষা করুন।
মহেশ

1

এক্সটেনশন পদ্ধতিটি একটি স্ট্যাটিক শ্রেণীর মধ্যে থাকা উচিত। সুতরাং দয়া করে একটি স্ট্যাটিক শ্রেণীর ভিতরে আপনার বর্ধনের পদ্ধতি যুক্ত করুন।

সুতরাং উদাহরণস্বরূপ এটি করা উচিত

public static class myclass
    {
        public static Byte[] ToByteArray(this Stream stream)
        {
            Int32 length = stream.Length > Int32.MaxValue ? Int32.MaxValue : Convert.ToInt32(stream.Length);
            Byte[] buffer = new Byte[length];
            stream.Read(buffer, 0, length);
            return buffer;
        }

    }

বছর আগে দেওয়া উত্তর থেকে এটি কীভাবে আলাদা?
মার্টেন বোদেউয়েস

1

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


0

আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি, আমি একটি 'ফু' ফোল্ডার তৈরি করেছি এবং ফু এর অভ্যন্তরে একটি "শ্রেণি" তৈরি করেছি, তারপরে আমি পূর্বোক্ত ত্রুটিটি পেয়েছি। একটি ফিক্সটি ক্লাসে পূর্বে উল্লিখিত হিসাবে "স্ট্যাটিক" যুক্ত করা যা "পাবলিক স্ট্যাটিক ক্লাস লিনকহেল্পার" হবে।

আমার ধারনা হ'ল আপনি যখন foo ফোল্ডারের ভিতরে একটি শ্রেণি তৈরি করেন তখন এটি এটিকে একটি এক্সটেনশন শ্রেণি হিসাবে বিবেচনা করে, সুতরাং নিম্নলিখিত আন্তঃআবিধি নিয়ম এটি প্রয়োগ করে:

1) প্রতিটি এক্সটেনশন পদ্ধতি অবশ্যই একটি স্ট্যাটিক পদ্ধতি হতে পারে

কার্যকরী আপনি যদি স্থির না চান। আমার কর্মক্ষেত্রটি ছিল সরাসরি নেমস্পেসের নীচে একটি ক্লাস তৈরি করা এবং তারপরে এটি "foo" ফোল্ডারে টেনে আনতে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.