using System; using System.ComponentModel; using System.Diagnostics; namespace Application { public sealed class FooClass where S : class { public static FooClass Create(string name, Action action) { return new FooClass(name, action); } public static FooClass Create(S source, string name, Func func, FooClass fooChild) where T : class { return new FooClass(source, name, CreateCallback(func, fooChild)); } private static Action CreateCallback( Func func, FooClass fooChild) where T : class { return delegate(S source) { }; } private FooClass(string name, Action action) { m_name = name; m_action = action; } private FooClass(S source, string name, Action action) : this(name, action) { m_source = source; } S m_source; readonly string m_name; Action m_action; } public class MyClass { public int Value { get; set; } public MyClass Child { get; set; } } public class VarCompilerTest { public static void Main(string[] args) { MyClass obj = new MyClass(); int nCalls = 0; FooClass fooChild = FooClass.Create("Value", delegate { nCalls++; }); FooClass.Create(obj, "Child", x => x.Child, fooChild); } } }