كيف يمكنني تمرير طريقة الحصول عليها من قبل التفكير في C# إلى الأسلوب الذي يقبل الأسلوب كما تفوض ؟

StackOverflow https://stackoverflow.com/questions/1626170

سؤال

أنا أدرك أن العنوان يحتاج إلى قراءة أكثر من مرة لفهم ...:)

لقد نفذت سمة مخصصة التي لا تنطبق على الطرق في دروسي.جميع طرق تطبيق السمة أن يكون نفس التوقيع وبالتالي تعريف مندوب لهم:

public delegate void TestMethod();

لدي البنية التي تقبل أن مندوب كمعلمة

struct TestMetaData
{
  TestMethod method;
  string testName;
}

هل من الممكن الحصول على من انعكاس أسلوب الذي يحتوي على سمة مخصصة ، وتمريرها إلى البنية إلى 'الطريقة' الأعضاء ؟

وأنا أعلم أنك يمكن أن تحتج بها ولكن أعتقد انعكاس لن تعطيني الطريقة الفعلية من الفئة التي لا يمكن أن يلقي إلى TestMethod مندوب.

هل كانت مفيدة؟

المحلول

مرة واحدة لديك MethodInfo عن طريق التفكير ، يمكنك استخدام مندوب.CreateDelegate لتحويلها إلى مندوب ، ومن ثم استخدام انعكاس لوضع هذا مباشرة إلى مكان الإقامة/مجال البنية الخاصة بك.

نصائح أخرى

يمكنك إنشاء تفويض تلك المكالمات الخاصة بك تعكس الأسلوب في وقت التشغيل باستخدام الاحتجاج ، أو مندوب.CreateDelegate.

على سبيل المثال:

using System;
class Program
{
    public delegate void TestMethod();
    public class Test
    {
        public void MyMethod()
        {
            Console.WriteLine("Test");
        }
    }
    static void Main(string[] args)
    {
        Test t = new Test();
        Type test = t.GetType();
        var reflectedMethod = test.GetMethod("MyMethod");
        TestMethod method = (TestMethod)Delegate.CreateDelegate(typeof(TestMethod), t, reflectedMethod);
        method();
    }
}

كما تحتاج مناسبة مندوب إلى أن أعلنت بالفعل

كمثال:

using System;
using System.Linq;

using System.Reflection;
public delegate void TestMethod();
class FooAttribute : Attribute { }
static class Program
{
    static void Main() {
        // find by attribute
        MethodInfo method =
            (from m in typeof(Program).GetMethods()
             where Attribute.IsDefined(m, typeof(FooAttribute))
             select m).First();

        TestMethod del = (TestMethod)Delegate.CreateDelegate(
            typeof(TestMethod), method);
        TestMetaData tmd = new TestMetaData(del, method.Name);
        tmd.Bar();
    }
    [Foo]
    public static void TestImpl() {
        Console.WriteLine("hi");
    }
}

struct TestMetaData
{
    public TestMetaData(TestMethod method, string name)
    {
        this.method = method;
        this.testName = name;
    }
    readonly TestMethod method;
    readonly string testName;
    public void Bar() { method(); }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top