সি # তে একটি স্ট্রিং থেকে একটি ফাংশন কল করা হচ্ছে


145

আমি পিএইচপি তে জানি আপনি এইরকম কল করতে পারবেন:

$function_name = 'hello';
$function_name();

function hello() { echo 'hello'; }

। নেট এ এটি সম্ভব?


2
আমি দেখেছি যে আপনার পদ্ধতিটিও হওয়া উচিত public
zapoo

উত্তর:


268

হ্যাঁ. আপনি প্রতিবিম্ব ব্যবহার করতে পারেন। এটার মতো কিছু:

Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod(TheCommandString);
theMethod.Invoke(this, userParameters);

56
এবং এর জন্য "সিস্টেম ব্যবহার করে efনির্ধারণ;"
jptsetung

1
এটি প্যারামিটার সহ কোনও ফাংশন চাওয়ার জন্যও ব্যবহার করা যেতে পারে: যেমন স্ট্রিং এফ = "পদ্ধতি (প্যারামিটার 1, পরামিতি 2)";
থান্ডার

প্রতিক্রিয়া জন্য ধন্যবাদ @ টোটোবার আমি যা জানি এটিও এটি কিনা আমি জানি না: আমার সি # কোডে আমার এসকিউএল স্কেলার ফাংশনটি ব্যবহার করা দরকার। আমি এটাকে কীভাবে ডাকব?
ছাগবার্ট

1
FYI আপনার ওভারলোড পদ্ধতিগুলি ব্যবহার করে এটি কাজ করে না work
শন ও'নিল

উপরের কোড সহ - যে পদ্ধতিটি আহ্বান করা হয়েছে তাতে অবশ্যই অ্যাক্সেস মডিফায়ার থাকতে হবে - পাবলিক। যদি জনসাধারন না করে দয়া করে বাঁধাই পতাকা ব্যবহার করুন - বাইন্ডিংফ্ল্যাগস onনপাবলিক | বাইন্ডিংফ্ল্যাজস.ইনস্ট্যান্স .. Type thisType = this.GetType(); MethodInfo theMethod = thisType.GetMethod(TheCommandString, BindingFlags.NonPublic | BindingFlags.Instance); theMethod.Invoke(this, userParameters);
শিবগাথ

75

আপনি একটি গতিশীল পদ্ধতির প্রার্থনা করে প্রতিবিম্ব ব্যবহার করে কোনও শ্রেণীর উদাহরণের পদ্ধতিটি আহ্বান করতে পারেন:

মনে করুন যে আপনার কাছে আসল উদাহরণে (এটি) হ্যালো নামে একটি পদ্ধতি রয়েছে:

string methodName = "hello";

//Get the method information using the method info class
 MethodInfo mi = this.GetType().GetMethod(methodName);

//Invoke the method
// (null- no parameter for the method call
// or you can pass the array of parameters...)
mi.Invoke(this, null);

1
"স্ট্রিং" ক্লাসের পদ্ধতি সম্পর্কে কি? ফ্রেমওয়ার্ক 4 ব্যবহার
লিয়ান্দ্রো

36
class Program
    {
        static void Main(string[] args)
        {
            Type type = typeof(MyReflectionClass);
            MethodInfo method = type.GetMethod("MyMethod");
            MyReflectionClass c = new MyReflectionClass();
            string result = (string)method.Invoke(c, null);
            Console.WriteLine(result);

        }
    }

    public class MyReflectionClass
    {
        public string MyMethod()
        {
            return DateTime.Now.ToString();
        }
    }

এটি কোনও শ্রেণীর উপর নির্ভরশীল নয়
লন্ডান্দার

এবং পদ্ধতি বাতিল?
কিকিনেট

2

কিছুটা স্পর্শকাতর - আপনি যদি একটি সম্পূর্ণ এক্সপ্রেশন স্ট্রিংকে বিশ্লেষণ করতে এবং মূল্যায়ন করতে চান যা (নেস্টেড!) ফাংশনগুলি ধারণ করে, NCalc ( http://ncalc.codeplex.com/ এবং nuget) বিবেচনা করুন

যাত্রা। প্রকল্পের ডকুমেন্টেশন থেকে সামান্য পরিবর্তিত:

// the expression to evaluate, e.g. from user input (like a calculator program, hint hint college students)
var exprStr = "10 + MyFunction(3, 6)";
Expression e = new Expression(exprString);

// tell it how to handle your custom function
e.EvaluateFunction += delegate(string name, FunctionArgs args) {
        if (name == "MyFunction")
            args.Result = (int)args.Parameters[0].Evaluate() + (int)args.Parameters[1].Evaluate();
    };

// confirm it worked
Debug.Assert(19 == e.Evaluate());

এবং EvaluateFunctionপ্রতিনিধি মধ্যে আপনি আপনার বিদ্যমান ফাংশন কল করবে।


0

বাস্তবে আমি উইন্ডোজ ওয়ার্কফ্লো flow.৪ এ কাজ করছি এবং আমি কোনও সাফল্য ছাড়াই একটি স্টেটম্যাচিন থেকে কোনও পদ্ধতিতে একজন প্রতিনিধিকে পাস করার একটি উপায় খুঁজে পেয়েছি। আমি যে উপায়টি পেয়েছি তা হ'ল ডেলিগেট হিসাবে যে পদ্ধতিটি আমি পাস করতে চেয়েছিলাম তার নামের সাথে একটি স্ট্রিং পাস করা এবং স্ট্রিংটিকে পদ্ধতির অভ্যন্তরে একটি প্রতিনিধিতে রূপান্তর করা। খুব সুন্দর উত্তর। ধন্যবাদ। এই লিঙ্কটি দেখুন https://msdn.microsoft.com/en-us/library/53cz7sc6(v=vs.110).aspx


0
এই কোডটি আমার কনসোলটিতে কাজ করে। নেট অ্যাপ্লিকেশন
class Program
{
    static void Main(string[] args)
    {
        string method = args[0]; // get name method
        CallMethod(method);
    }
    
    public static void CallMethod(string method)
    {
        try
        {
            Type type = typeof(Program);
            MethodInfo methodInfo = type.GetMethod(method);
            methodInfo.Invoke(method, null);
        }
        catch(Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
            Console.ReadKey();
        }
    }
    
    public static void Hello()
    {
        string a = "hello world!";
        Console.WriteLine(a);
        Console.ReadKey();
    }
}

তাই আপনাকে স্বাগতম! আমি আপনার উত্তরটি পছন্দ করি, আপনি কী করছেন সে সম্পর্কে আপনি আরও কিছুটা ব্যাখ্যা করতে পারেন?
এ.দেশপান্ডে012 12

হাই, অফ কোর্স। এটি একটি কনসোল। নেট অ্যাপ্লিকেশন, "প্রোগ্রাম ক্লাস" এর ভিতরে বিভিন্ন পদ্ধতি বা ফাংশন রয়েছে, উদাহরণস্বরূপ: হ্যালো, হ্যালো 2, হ্যালো 2। "কলমেথোদ (স্ট্রিং মেথড)" পদ্ধতিটি অনুসন্ধান করে আমাকে স্ট্রিং প্যারামিটার নামে "প্রোগ্রাম ক্লাস" এর অভ্যন্তরে যে কোনও পদ্ধতিতে আবেদন করতে দেয়। আমি যখন "উইন্ডোজ কনসোল" থেকে অ্যাপ্লিকেশনটি সম্পাদন করি: আমি লিখি: "নাম অ্যাপ" + "পদ্ধতিটি আমার প্রয়োজন।" উদাহরণস্বরূপ: মাইএপ হ্যালো, তারপরে "হ্যালো ওয়ার্ল্ড!" ফিরে আসুন। "মাইয়াপ হ্যালো 2" বা "মাইয়াপ হ্যালো 3 "ও হতে পারে। আমি মনে করি যে কোনও। নেট অ্যাপ্লিকেশন কাজ করতে পারে।
রানোব

আপনাকে প্রতিচ্ছবি শ্রেণি যুক্ত করতে হবে: "সিস্টেম ব্যবহার করে ef প্রতিস্থাপন;"।
রানোব

-9

সি # তে, আপনি ফাংশন পয়েন্টার হিসাবে প্রতিনিধি তৈরি করতে পারেন। ব্যবহারের তথ্যের জন্য নিম্নলিখিত এমএসডিএন নিবন্ধটি দেখুন:http://msdn.microsoft.com/en-us/library/ms173171(VS.80).aspx

    public static void hello()
    {
        Console.Write("hello world");
    }

   /* code snipped */

    public delegate void functionPointer();

    functionPointer foo = hello;
    foo();  // Writes hello world to the console.

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