Сокращение для создания и инициализации с использованием метода расширения - PullRequest
1 голос
/ 27 июля 2010

Есть ли какое-либо сокращение для использования метода расширения для создания и инициализации объекта?

Моя цель - абстрагировать и инкапсулировать код, необходимый для создания и инициализации экземпляра MyType, подходящего для модульного тестирования.

Пример:

//...
//convoluted client code - I'd like to avoid the null instance creation
MyType t = null;
t = t.GetTestInstance();
//...

//extension method
public static class MyTypeExtensions
{
  public static MyType GetTestInstance(this MyType t)
  {
    var ctorInjectedDependency = blah;

    return new MyType(ctorInjectedDependency);
  }
}

1 Ответ

1 голос
/ 27 июля 2010

Может быть, что-то вроде этого подойдет вашим потребностям:

public class MyType
{
  public MyType(string s)
  {
    Property = s;
  }

  public string Property { get; set; }
}

public static class MyTypeExtensions
{
  public static object GetTestInstance(this Type t)
  {
    var ctorInjectedDependency = "blah";
    var ctorInfo = t.GetConstructor(new[]{typeof(string)});

    return ctorInfo.Invoke(new object[] {ctorInjectedDependency});
  }

  public static T GetTestInstance<T>(this Type t)
  {
    var ctorInjectedDependency = "blah";
    var ctorInfo = t.GetConstructor(new[] { typeof(string) });

    return (T)ctorInfo.Invoke(new object[] { ctorInjectedDependency });
  }
}

Использование:

var my = typeof(MyType).GetTestInstance(); // maybe just object is enough
var my2 = typeof(MyType).GetTestInstance<MyType>();


Console.WriteLine((my as MyType).Property);
Console.WriteLine(my2.Property);
...