Chủ yếu là nó có ích khi các đại biểu C# đã lưu trữ đối tượng cùng với hàm thành viên. Nhưng có cách nào, để lưu trữ - và vượt qua như các tham số - chỉ có chức năng thành viên của chính nó, cũng giống như hàm con trỏ thành thành viên cũ trong C++?Đi qua các hàm thành viên trong C#
Trong trường hợp mô tả ít hơn rõ ràng, tôi đưa ra ví dụ độc lập. Và, vâng, trong ví dụ, sự khăng khăng để vượt qua các chức năng của thành viên là hoàn toàn vô nghĩa, nhưng tôi đã sử dụng nghiêm túc hơn cho việc này.
class Foo {
public int i { get; set; }
/* Can this be done?
public static int Apply (Foo obj, ???? method, int j) {
return obj.method (j);
}
*/
public static int ApplyHack (Foo obj, Func<int, int> method, int j) {
return (int) method.Method.Invoke (obj, new object [] { j });
}
public static readonly Foo _ = new Foo(); // dummy object for ApplyHack
public int Multiply (int j) {
return i * j;
}
public int Add (int j) {
return i + j;
}
}
class Program {
static void Main (string [] args) {
var foo = new Foo { i = 7 };
Console.Write ("{0}\n", Foo.ApplyHack (foo, Foo._.Multiply, 5));
Console.Write ("{0}\n", Foo.ApplyHack (foo, Foo._.Add, 5));
Console.ReadKey();
}
}
Bạn thấy đấy, giải pháp thay thế duy nhất tôi thấy là khá xấu và có thể chậm.
Chắc chắn là sạch hơn ... tuy nhiên, nếu bạn đã có đại biểu, bạn không cần phương thức 'ApplyHack' để gọi nó. – cdhowie
Đồng ý, nhưng kể từ khi câu hỏi cho thấy có nhiều vấn đề này hơn được hiển thị trong ví dụ, tôi đã cố gắng để giữ cho câu trả lời của tôi tương tự. – Zooba
Lưu ý rằng bạn cũng có thể đổi tên 'Multiply' thành' toán tử * 'để quá tải toán tử nếu điều đó hữu ích hơn cho bạn. – Zooba