문제

저는 현재 이러한 유형의 코드:

private void FillObject(Object MainObject, Foo Arg1, Bar Arg2)
{
    if (MainObject is SomeClassType1)
    {
        SomeClassType1 HelpObject = (SomeClassType1)MainObject;
        HelpObject.Property1 = Arg1;
        HelpObject.Property2 = Arg2;
    }
    else if (MainObject is SomeClassType2)
    {
        SomeClassType2 HelpObject = (SomeClassType2)MainObject;
        HelpObject.Property1 = Arg1;
        HelpObject.Property2 = Arg2;
    }
}

가정 SomeClassType1 및 SomeClassType2 동일한 세트의 속성하고 싶은 지정(하지만 그들이 다를 수 있습니다 다른 사람),그것은 동적으로 캐스팅 MainObject 적절한 입력하고 다음에 할당 값없이 복제 코드?이것은 무엇을 보고 싶은 결국:

private void FillObject(Object MainObject, Foo Arg1, Bar Arg2)
{
    Type DynamicType = null;

    if (MainObject is SomeClassType1)
    {
        DynamicType = typeof(SomeClassType1);
    }
    else if (MainObject is SomeClassType2)
    {
        DynamicType = typeof(SomeClassType2);
    }

    DynamicType HelpObject = (DynamicType)MainObject;
    HelpObject.Property1 = Arg1;
    HelpObject.Property2 = Arg2;
}

분명히 C#에 대해 불평을 찾을 수 없 DynamicType:

입력 또는 네임스페이스 이름을'DynamicType'를 찾을 수 없습(은 당신이 놓치 지시어를 사용하여하거나 어셈블리 기준?)

무언가가 다음과 같이 가능한 C#2.0?면 그것은 더 많은 지저분하다 현재는 코드,보다 나는 아무에 이렇게,그러나 나는 아주 관심 밖으로 찾을 수 있습니다.감사합니다!

편집:을 명확히,나는 완벽하게 이해하는 인터페이스 구현은 가장 적합한 아마 올바른 솔루션을 제공합니다.는 말했다,내가에 더 관심을 보고 어떻게 내가 그것을 할 수 없이 구현하는 인터페이스입니다.감사에 대한 훌륭한 대답!

도움이 되었습니까?

해결책

그것처럼 보이는 유형의 두 대를 구현하는 같은 두 가지 특성.는 경우에,당신이 원하는 무엇이 인터페이스를 정의한 속성:

public interface IMyInterface
{
   public Foo Property1 {get; set;}
   public Bar Property2 {get;set;}
}

한 다음 각각의 확인,귀하의 수업을 말하는 컴파일러를 구현하는 새로운 인터페이스를 제공합니다.마지막으로,사용하는 일반적인 방법으로는 형식 인수를 제한되는 interace:

private void FillObject<T>(T MainObject, Foo Arg1, Bar Arg2) 
    where T : IMyInterface
{
    MainObject.Property1 = Arg1;
    MainObject.Property2 = Arg2;
}

참고로 추가 코드를 인터페이스를 선언,이러한 조각은 여전히 끝날보다 짧거나 조각 중 하나 당신에 게시된 질문,그리고 이 코드는 훨씬 쉽게 확장할 경우에는 숫자의 유형은 당신에 대해 관심이 증가합니다.

다른 팁

본질적으로 여기서하고있는 일은 객체의 유형을 기반으로 스위치 문을 작성하는 것입니다. 첫 번째 예제 외에는 본질적으로 좋은 방법이 없습니다 (기껏해야 지루함).

나는 구문을 좀 더 간결하게 만드는 유형을 켜기위한 작은 프레임 워크를 썼습니다. 다음과 같이 코드를 쓸 수 있습니다.

TypeSwitch.Do(
    sender,
    TypeSwitch.Case<Button>(
        () => textBox1.Text = "Hit a Button"),
    TypeSwitch.Case<CheckBox>(
        x => textBox1.Text = "Checkbox is " + x.Checked),
    TypeSwitch.Default(
        () => textBox1.Text = "Not sure what is hovered over"));

블로그 게시물: http://blogs.msdn.com/jaredpar/archive/2008/05/16/switching-on-types.aspx

someclasstype1, someclasstype2 등을 변경할 수 있습니까? 그렇다면 공통 속성이 포함 된 인터페이스를 작성한 다음이 인터페이스에 타이핑하는 것이 좋습니다. FillObject() 속성을 설정합니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SO566510
{
    interface IMyProperties
    {
        int Property1 { get; set; }
        int Property2 { get; set; }
    }

    class SomeClassType1 : IMyProperties
    {
        public int Property1 { get; set; }
        public int Property2 { get; set; }
    }

    class SomeClassType2 : IMyProperties
    {
        public int Property1 { get; set; }
        public int Property2 { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var obj1 = new SomeClassType1();
            var obj2 = new SomeClassType2();

            FillObject(obj1, 10, 20);
            FillObject(obj2, 30, 40);

        }

        private static void FillObject(IMyProperties objWithMyProperties
                                   , int arg1, int arg2)
        {
            objWithMyProperties.Property1 = arg1;
            objWithMyProperties.Property2 = arg2;
        }
    }
}
private void FillObject(Object MainObject, Foo Arg1, Bar Arg2)
{
    Type t = MainObject.GetType();

    t.GetProperty("Property1").SetValue(MainObject, Arg1, null);
    t.GetProperty("Property2").SetValue(MainObject, Arg2, null);
}

몇 가지 아이디어 :

  1. 두 유형 모두 공통 속성을 가진 동일한 유형에서 상속되도록합니다.
  2. 두 유형 모두 공통 속성이있는 동일한 인터페이스를 구현하도록합니다.
  3. 반사를 사용하여 속성을 직접 설정하는 대신 속성을 설정하십시오 (아마도 가치있는 것보다 더 못 생겼을 것입니다).
  4. 새로운 것을 사용하십시오 동적 특징, 나는 이것을 시도하지 않았지만 당신의 문제를 해결할 수있을 것 같습니다.

캐스트를 시도하는 대신 반사를 사용하여 속성을 설정할 수 있습니다.

ASP.NET MVC 앱에서 반사를 사용하여 개체를 동적으로 주조하고 있습니다. 기본적으로 클래스의 속성을 열거하고 데이터 저장소에서 해당 값을 찾아 값을 동적으로 시전하고 객체 인스턴스에 할당합니다. 내 블로그 게시물을 참조하십시오.NET을 사용한 동적 캐스팅

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top