있는 우아한 방법으로 인스턴스화하는 변수가 형식으로 매개 변수는?

StackOverflow https://stackoverflow.com/questions/96541

  •  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!");
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top