문제

내가 있는 클래스가 다음 생성자

public DelayCompositeDesigner(DelayComposite CompositeObject)
{
    InitializeComponent();

    compositeObject = CompositeObject;  
}

와 함께 기본 생성자이 없는 매개 변수입니다.

다음하는 인스턴스를 만들지만,그것은 단지없이 작동 매개변수:

var designer = Activator.CreateInstance(designerAttribute.Designer);

이 작지만 만약 내가 원하는 전달하는 매개변수하지 않:

var designer = Activator.CreateInstance(designerAttribute.Designer, new DelayComposite(4));

이 결과 MissingMethodException:

생성자 voor 유형 Vialis.LightLink.컨트롤러입니다.시나리오.합니다.DelayCompositeDesigner 발견되지 않았

어떤 아이디어요?


문제는 내가 정말 필요가 전체 동안 건설입니다.

당신이 볼 나는 디자이너는 모든 형태로부터 상속되는 CompositeBase.이들은 다음 목록에 추가에서는 사용자를 끌어들입니다.그렇게하의 인스턴스를 끌고 추가되는 디자이너.이러한 각각의 클래스는 사용자 정의 속성에 정의된다:

[CompositeMetaData("Delay","Sets the delay between commands",1)]
[CompositeDesigner(typeof(DelayCompositeDesigner))]
public class DelayComposite : CompositeBase
{
}

사용자 선택 품목에서는 디자이너,그것은 외모에서 이러한 특성하기 위해서드에 대한 디자이너는 유형입니다.예를 들어,의 경우에는 DelayComposite 그것은 것이드에 사용자 정의 컨트롤는 레이블 및 슬라이더를 허용하는 사용자를 설정하는 지연의 속성 DelayComposite 인스턴스입니다.

지금까지 잘 작동하지 않으면 나는 어떠한 매개 변수를 생성자입니다.디자이너의 인스턴스를 만듭니다 DelayCompositeDesigner 고 할당하는 콘텐츠의 재산 WPF ContentPresenter.

그러나 그 이후 설계자의 요구를 충족하의 속성을 수정하고 선택한 DelayComposite 디자이너에서 내가 이스습니다.은 이유는 생성자를 보이는 거짓말을 이:

public DelayCompositeDesigner(DelayComposite CompositeObject)
{
    InitializeComponent();

    compositeObject = CompositeObject;
}

제안을 환영합니다


@VolkerK

결과의 코드입니다 이것:

<----foo Vialis.LightLink.컨트롤러입니다.시나리오.합니다.DelayCompositeDesignerVoid .ctor() Vialis.LightLink.컨트롤러입니다.시나리오.합니다.DelayCompositeDesignerVoid .ctor(Vialis.LightLink.컨트롤러입니다.시나리오.합니다.DelayComposite) param:Vialis.LightLink.컨트롤러입니다.시나리오.합니다.DelayComposite foo---->


Leppie,당신이 올바른지,나는 어떤 이유에서 참조 복합 재료는 어셈블리에서 나 UI 응용 프로그램...지 않는 무언가가 있어야로드 수 있습니다.다음 코드를 사용해야 합니다:

object composite = Activator.CreateInstance(item.CompositType,(byte)205);
                    var designer = Activator.CreateInstance(designerAttribute.Designer, composite);

당신이 볼 수 있는 코드가 없는 지식 DelayComposite 유형입니다.

이를 해결 현재의 문제만에서는 많은 새 사람을 위해 무엇을 달성하고 싶, 어느 방법으로 감사하고 고맙습니다 모든 사람에게 대답했다 여기에.


으로 다음과 같은 코드에 의해 제안된 여러 사용:

var designer = Activator.CreateInstance(
    designerAttribute.Designer, 
    new object[] { new DelayComposite(4) } 
);

Activator.CreateInstance 시그니처는 다음과 같습니다.

Activator.CreateInstance(Type type, params object[] obj)

그래서 그것을 받아들여야 합니 나의 코드,하지만 완료하려면 시간이 좀 걸릴 것입니다 제안 코드

업데이트:

나도 이 제안:

var designer = Activator.CreateInstance(designerAttribute.Designer, new object[] { new DelayComposite(4)});

결과 같습니다.

도움이 되었습니까?

해결책

나는 생각을 다루고 형식과 불일치가 발생할 수 있습니다.

가능성이 어셈블리에서 참조하는 다른 장소,또는 그들이 컴파일되기 다른 버전입니다.

나는 당신을 반복하고 예의 및 수행 paramtype == typeof(DelayComposite) 에 적절한 매개 변수입니다.

다른 팁

내가 생각하는 당신의 통화가 필요하다:

var designer = Activator.CreateInstance(designerAttribute.Designer, new object[] { new DelayComposite(4) });

지 않으면,물론 그것은 는 경우에는 대답은 바로 명백합니다.

하지만 싫어 printf 같은 디버깅...

public static void foo(Type t, params object[] p)
{
    System.Diagnostics.Debug.WriteLine("<---- foo");
    foreach(System.Reflection.ConstructorInfo ci in t.GetConstructors())
    {
        System.Diagnostics.Debug.WriteLine(t.FullName + ci.ToString());
    }
    foreach (object o in p)
    {
        System.Diagnostics.Debug.WriteLine("param:" + o.GetType().FullName);
    }
    System.Diagnostics.Debug.WriteLine("foo ---->");
}
// ...
foo(designerAttribute.Designer, new DelayComposite(4));
var designer = Activator.CreateInstance(designerAttribute.Designer, new DelayComposite(4));

무엇을 하는 인쇄 visual studio 출력 창?

하려는 경우 이 contructor...

public DelayCompositeDesigner(DelayComposite CompositeObject)

...단지 이것을 사용:

var designer = Activator.CreateInstance(typeof(DelayCompositeDesigner), new DelayComposite(4));

var designer = Activator.CreateInstance<DelayCompositeDesigner>(new DelayComposite(4));

나는 유사한 문제,그러나 나의 문제 때문에 가시성 의 생성자입니다.Stack overflow 도왔:

인스턴스화로 생성자에서 매개 변수의 내부 반사 클래스

내가 발견 또 다른 방법의 인스턴스를 만들지 않고 객체의 생성자를 호출하에서는 동안 모든 응답 다른 질문에 SF.

시스템입니다.런타임입니다.Serialization 네임스페이스 기능이 있습니다 FormatterServices.GetUninitializedObject(type) 는 개체를 만들지 않고 부르 생성자입니다.

을 살펴보면 그 기능에서 반사체 당신은 그것을 볼 수은 외부 전화입니다.지 않는 방법을 알고 마술 실제로 일어나고 있습니다.그러나 나았다는 증명을 자신의 생성자가 호출되지 않지만 객체를 인스턴스화됩니다.

다음을 사용할 수 있습니다 과부하에 CreateInstance:

public static Object CreateInstance(
    Type type,
    Object[] args
)

고 당신의 경우에 그것은 것(나는 생각한다):

var designer = Activator.CreateInstance(
    typeof(DelayCompositeDesigner), 
    new object[] { new DelayComposite(4) } 
);

내가 찾는 문제에 대한 해결책,힘들었습으로 동일한 문제입니다.

여기에는 나의 활성제:

private void LoadTask(FileInfo dll)
    {
        Assembly assembly = Assembly.LoadFrom(dll.FullName);

        foreach (Type type in assembly.GetTypes())
        {
            var hasInterface = type.GetInterface("ITask") != null;

            if (type.IsClass && hasInterface)
            {
                var instance = Activator.CreateInstance(type, _proxy, _context);
                _tasks.Add(type.Name, (ITask)instance);
            }
        }
    }

그리고 여기 나의 클래스를 활성화를 주었다는 것을 변경할 생성자 params 하는 개체의 유일한 방법은 나는 그것을 얻을 수 있습니다.

public class CalculateDowntimeTask : Task<CalculateDowntimeTask>
{
    public CalculateDowntimeTask(object proxy, object context) : 
        base((TaskServiceClient)proxy, (TaskDataDataContext)context) { }

    public override void Execute()
    {
        LogMessage(new TaskMessage() { Message = "Testing" });
        BroadcastMessage(new TaskMessage() { Message = "Testing" });
    }
}

을 때 저는 이 문제가 발생했을 사용하는 방법을 반환되는 매개 변수 목록에 연결하는 Activator.CreateInstance 및 그것의 다른 번호를 인수 이상 생성자의 개체고 만들 수 있습니다.

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