using System;
using System.Reflection;
class Program
{
static void Main()
{
var t1 = MyClass.New(() => 1); // ОК
//var t2 = new MyClass.NestedClass<int>(() => 1); // Ну да, теперь не компилируется..
}
}
public static class MyClass
{
public static NestedClass<T> New<T>(Func<T> func)
{
var info = typeof (NestedClass<T>).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance, null, new[] {typeof (Func<T>)}, null);
return (info == null) ? null : (NestedClass<T>) info.Invoke(new[] {func});
}
public sealed class NestedClass<T>
{
private Func<T> _func;
private NestedClass(Func<T> func)
{
_func = func;
}
}
}
* This source code was highlighted with Source Code Highlighter.
using System;
class Program
{
static void Main()
{
var t1 = MyClass.New(() => 1); // ОК
var t2 = new MyClass.NestedClass<int>(() => 1); // Не должно компилироваться!
}
}
public static class MyClass
{
public static NestedClass<T> New<T>(Func<T> func)
{
return new NestedClass<T>(func);
}
public sealed class NestedClass<T>
{
private Func<T> _func;
public NestedClass(Func<T> func)
{
_func = func;
}
}
}
* This source code was highlighted with Source Code Highlighter.
public static class MyClass
{
// Приходится писать dynamic - параметризация, сцуко (может можно как-то по-другому, не знаю)
private static Func<dynamic, dynamic> _createNestedClass;
public static NestedClass<T> New<T>(Func<T> func)
{
return _createNestedClass(func); // Object reference not set to an instance of an object
}
public sealed class NestedClass<T>
{
private Func<T> _func;
static NestedClass()
{
// MSDN
//
// Статический конструктор вызывается автоматически для инициализации класса перед
// созданием первого экземпляра или ссылкой на какие-либо статические члены
//
// Статический конструктор нельзя вызывать напрямую
//
// Пользователь не управляет тем, когда статический конструктор выполняется в программе
_createNestedClass = f => new NestedClass<T>(f);
}
private NestedClass(Func<T> func)
{
_func = func;
}
}
}
* This source code was highlighted with Source Code Highlighter.
using System;
class Program
{
static void Main()
{
var t1 = MyClass.New(() => 1); // ОК
var t2 = new MyClass.NestedClass<int>(() => 1); // Не должно компилироваться!
}
}
public static class MyClass
{
interface INestedClass<out T>
{
void Method1();
void Method2(Action<T> action);
}
public static INestedClass<T> New<T>(Func<T> func)
{
return new // чё?
}
private sealed class NestedClass<T> : INestedClass<T>
{
private Func<T> _func;
private NestedClass(Func<T> func)
{
_func = func;
}
public void Method1() { }
public void Method2(Action<T> action) { }
}
}
* This source code was highlighted with Source Code Highlighter.