2017-04-11 1 views
-4

MyObject이라는 클래스가 있고 매개 변수 개수를 전달하고 싶습니다. 이것을 어떻게 만들 수 있습니까? 때로는 이름 만 사용하고 때로는 모든 것을 사용합니다.무제한 매개 변수가있는 호출 생성자

전 C#을 사용하고 4.0

MyObject 

    int Id 
    string name 
    datetime creationdate 
    int createbyid 
    int modifiedbyid 
    datetime modifieddate 

답변

3

IT는 object initialization syntax를 사용하는 것이 가장 쉬운 방법 일 수 있습니다.

MyObject obj = new MyObject() { Id = 27, Name = "Daniel" }; 

무언가가 필요하면 생성자 인수를 사용하십시오.

+0

잘 작동합니다. 감사! –

0

커버하려는 각 시나리오마다 다른 생성자를 만들 수 있습니다.

public class MyClass 
{ 
    public MyClass(string name) 
    { 

    } 

    public MyClass(string name, DateTime creationDate) 
    { 

    } 
} 

이렇게하면 개체가 잘못된 초기 상태로 생성되는 것을 방지 할 수 있습니다.

0

이 대답은 일부 사람들이 싫증나게 할 수도 있지만, 일부 사용자는 그것을 좋아할 것입니다. object initialization syntax의 이점을 제공하고 또한 유효성 검사기를 추가하거나, 개인 또는 읽기 전용 입력란에 매개 변수를 할당하거나, 객체 초기화 구문으로는 불가능한 다른 런타임 검사를 수행합니다.

요약 : 원하는 매개 변수가 포함 된 익명 객체 하나를 전달한 다음 약간의 리플렉션을 사용하여 읽습니다. 그런 다음

static class ObjectExtensions 
{ 
    //Helper method for reading the properties from an anonymous class 
    public static T Peek<T>(this object source, string propertyName) 
    { 
     var prop = source.GetType().GetProperty(propertyName, typeof(T)); 
     return (prop == null) ? default(T) : (T)prop.GetValue(source); 
    } 
} 

object로 입력 하나의 생성자 인자로 클래스를 정의

첫째,이 확장 방법을 만들 수 있습니다. 무엇이든 당신이 이렇게 원하는 매개 변수, 익명 형식을 사용하여 MyClass를 인스턴스화 할 수 있습니다 지금

class MyClass 
{ 
    private readonly string _name; 
    private readonly int _id; 
    private readonly double _optional; 

    public MyClass(object o) 
    { 
     _name = o.Peek<string>("Name"); 
     _id = o.Peek<int>("ID"); 
     _optional = o.Peek<double>("Optional"); 
    } 

    public void ProveThatItWorked() 
    { 
     Console.WriteLine(String.Format("ID = '{0}' Name = '{1}' Optional='{2}'", _id, _name, _optional)); 
    } 
} 

:

MyClass c = new MyClass(new { Name = "My Name", ID = 17 }); 
c.ProveThatItWorked(); 

이를 사용하여 우리가 쓴 Peek 방법을 사용하여 값을 읽는 코드를 작성 기술을 사용하면 익명 객체에 원하는만큼 많은 명명 된 매개 변수를 전달할 수 있습니다. 단, 해당 문항을 읽으려면 Peek 문이 있어야합니다. 매개 변수가 익명 형식에 포함되어 있지 않으면 해당 매개 변수의 데이터 형식에 대한 기본값으로 되돌아갑니다. 사용되지 않는 매개 변수를 포함하면 무시됩니다. 당신이 원하는 경우

당신은이 도메인 형 객체에 대한 매우 강력하게하는 LINQ 쿼리에서 행을 전달할 수 있습니다

var list = from t in db.table 
      select new { ID = t.SomeIdentifier, Name = t.SomeName }; 
foreach (var i in list) { 
    var c = new MyClass(i); 
    c.ProveThatItWorked(); 
} 

개체 초기화 구문 것을보십시오.

주의 사항 :

  • 일반적 때문에 인텔리 오염 object에 확장 방법을 정의 할 때 찌푸리게된다. 절 개인적으로 너무 괴롭히지 않았습니다.
  • 이 방법은 컴파일 타임에 대부분의 실수를 잡지 않습니다.int이 예상되는 곳에서 string을 전달하려고 시도하면됩니다. 이것은 Javascript 세계 또는 다른 duck-typed 언어에서 완전히 표준이지만 많은 사람들을 괴롭 히게됩니다. 그러나 컴파일 타임 검사를 원한다면 익명 클래스를 사용하는 대신 자신의 클래스를 정의한 다음 대신 전달하십시오.
관련 문제