있는 우아한 방법으로 인스턴스화하는 변수가 형식으로 매개 변수는?
-
01-07-2019 - |
문제
이것은 법적인:
public class MyBaseClass
{
public MyBaseClass() {}
public MyBaseClass(object arg) {}
}
public void ThisIsANoNo<T>() where T : MyBaseClass
{
T foo = new T("whoops!");
}
이를 위해서는,당신이 해야 할 일부 유형에 반영체 위해 T 하거나 당신을 사용하여 활성화.CreateInstance.양쪽은 매우 불쾌한입니다.은 더 나은 방법이 있을까?
해결책
할 수 없습니다 제한하 T 이 특정 생성자 서명이외에 빈 생성자,그러나 제한할 수 있습 T 있는 공장 방법으로 원하는 서명:
public abstract class MyBaseClass
{
protected MyBaseClass() {}
protected abstract MyBaseClass CreateFromObject(object arg);
}
public void ThisWorksButIsntGreat<T>() where T : MyBaseClass, new()
{
T foo = new T().CreateFromObject("whoopee!") as T;
}
그러나 내가 제안하는 것이 아마도를 사용하여 다른 패턴 생성과 같은 추상적인 공장이 시나리오이다.
다른 팁
Nope.지 않는 경우에 전달하는 매개변수,다음를 제한할 수 있습신의 유형 param 을 필요가 없는 생성자입니다.그러나 당신이 필요로하는 경우,인수를 전달 당신은 당신의 행운입니다.
where T : MyBaseClass, new()
만 w/매개 변수가 없는 대중 생성자입니다.넘어서는,다시 활성화.CreateInstance(는 정말 없는 나쁜).
내가 볼 수 있는 작동하지 않습니다.
하지만 무엇에서 이것을 하고 있는가?
public void ThisIsANoNo<T>() where T : MyBaseClass
{
MyBaseClass foo = new MyBaseClass("whoops!");
}
이 모든 것을에서 상속 MyBaseClass 그들은 알 수 MyBaseClass,right?
나는 그것을 시도하고 이 작품이다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ThisIsANoNo<MyClass>();
ThisIsANoNo<MyBaseClass>();
}
public class MyBaseClass
{
public MyBaseClass() { }
public MyBaseClass(object arg) { }
}
public class MyClass :MyBaseClass
{
public MyClass() { }
public MyClass(object arg, Object arg2) { }
}
public static void ThisIsANoNo<T>() where T : MyBaseClass
{
MyBaseClass foo = new MyBaseClass("whoops!");
}
}
}
제휴하지 않습니다 StackOverflow