문제
저는 현재 이러한 유형의 코드:
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);
}
몇 가지 아이디어 :
- 두 유형 모두 공통 속성을 가진 동일한 유형에서 상속되도록합니다.
- 두 유형 모두 공통 속성이있는 동일한 인터페이스를 구현하도록합니다.
- 반사를 사용하여 속성을 직접 설정하는 대신 속성을 설정하십시오 (아마도 가치있는 것보다 더 못 생겼을 것입니다).
- 새로운 것을 사용하십시오 동적 특징, 나는 이것을 시도하지 않았지만 당신의 문제를 해결할 수있을 것 같습니다.
캐스트를 시도하는 대신 반사를 사용하여 속성을 설정할 수 있습니다.
ASP.NET MVC 앱에서 반사를 사용하여 개체를 동적으로 주조하고 있습니다. 기본적으로 클래스의 속성을 열거하고 데이터 저장소에서 해당 값을 찾아 값을 동적으로 시전하고 객체 인스턴스에 할당합니다. 내 블로그 게시물을 참조하십시오.NET을 사용한 동적 캐스팅