如何转换通用C#操作<;T1>;采取行动<;T2>;

如何转换通用C#操作<;T1>;采取行动<;T2>;,c#,generics,casting,delegates,C#,Generics,Casting,Delegates,我一直在与C#合作学习和创造一些东西;不幸的是,我对C#很陌生,我的演员阵容有些问题 我有一个Type1的动作,我想把它转换成Type2;这两种类型在编译时都是已知的。下面是我试图归档的内容的示例代码 public class Example <Resolve, Reject> { protected Resolve resolved; protected Reject rejected; public Example( Resolve value ) {

我一直在与C#合作学习和创造一些东西;不幸的是,我对C#很陌生,我的演员阵容有些问题

我有一个Type1的动作,我想把它转换成Type2;这两种类型在编译时都是已知的。下面是我试图归档的内容的示例代码

public class Example <Resolve, Reject>
{
    protected Resolve resolved;
    protected Reject rejected;

    public Example( Resolve value ) { resolved = value; }
    public Example( Reject value ) { rejected = value;  }

    public void invoke( Action<Resolve> callback ) {
        if( null != resolved ) { callback (resolved ); }
        else if( null != rejected ) {
            // How to cast action from Action <Resolve> to Action <Rejected>
            // and invoke it with the rejected value??
            callback ( rejected );
        }
        else throw new ApplicationException( "Not constructed" );
    }
}

public static void Main (string[] args)
{
    Console.WriteLine ("Start");

    var example1 = new Example <string, System.ArgumentException> ( "Str argument" );

    example1.invoke (msg => {
        // Here the msg is a string ok!
        if (msg is string) { Console.WriteLine (msg); }
        else { Console.WriteLine ("Exception"); }
    });

    var example2 = new Example <string, System.ArgumentException> ( new ArgumentException("An exception") );

    example2.invoke (msg => {
        // Here msg should be an ArgumentException.
        if (msg is string) { Console.WriteLine (msg); }
        else { Console.WriteLine ("Exception"); }
    });


    Console.WriteLine ("Done");
    Console.ReadLine ();
}
公共类示例
{
决心得到解决;
受保护的拒绝;
公共示例(解析值){resolved=value;}
公共示例(拒绝值){拒绝=值;}
公共无效调用(操作回调){
if(null!=已解析){回调(已解析);}
else if(null!=拒绝){
//如何从一个动作到另一个动作
//并使用拒绝的值调用它??
回拨(拒绝);
}
否则抛出新的ApplicationException(“未构造”);
}
}
公共静态void Main(字符串[]args)
{
Console.WriteLine(“开始”);
var example1=新示例(“Str参数”);
示例1.invoke(msg=>{
//这里的消息是一个字符串ok!
如果(msg是字符串){Console.WriteLine(msg);}
else{Console.WriteLine(“异常”);}
});
var example2=新示例(新参数异常(“异常”));
示例2.invoke(msg=>{
//这里msg应该是一个例外。
如果(msg是字符串){Console.WriteLine(msg);}
else{Console.WriteLine(“异常”);}
});
Console.WriteLine(“完成”);
Console.ReadLine();
}
我无法控制类型,因此无法将一个类型转换为另一个类型,即使可以,我正在实现的规范也要求我必须根据运行时发生的某些情况,使用resolve或Reject值解析回调


你能帮我吗?

免责声明:我是以下开源库的作者

如果您使用的是由提供的有区别的联合类型和模式匹配,您只需在此处编写所需内容:

public static void MessageOrException(Union<string, ArgumentException> value)
{
    value.Match().Case1().Do(Console.WriteLine)
                 .Else(Console.WriteLine("Exception")
                 .Exec();
}


public static void Main (string[] args)
{
    Console.WriteLine ("Start");

    var example1 = new Union<string, ArgumentException> ("Str argument");
    MessageOrException(example1);  // Writes "Str argument"

    var example2 = 
        new Union<string, ArgumentException>(new ArgumentException("An exception"));
    MessageOrException(example2); // Writes "Exception"

    Console.WriteLine ("Done");
    Console.ReadLine ();
}
公共静态无效消息或异常(联合值)
{
value.Match().Case1().Do(Console.WriteLine)
.Else(控制台写入线(“异常”)
.Exec();
}
公共静态void Main(字符串[]args)
{
Console.WriteLine(“开始”);
var example1=新的联合(“Str参数”);
MessageOrException(示例1);//写入“Str参数”
变量示例2=
新工会(新的例外(“例外”));
MessageOrException(示例2);//写入“异常”
Console.WriteLine(“完成”);
Console.ReadLine();
}

似乎您真的需要传入两个单独的操作。您在这里描述的是一个有区别的联合。正如@juharr所说,您需要两个单独的操作,根据值是在类型
T1
还是
T2
上调用。请看一看,这是一个联合类型,支持通过模式ma调用操作是的,在Succubic库中。你可能会发现它提供了你所需要的。(免责声明:我写的)嘿!我在看你的库,它看起来真的很不错!做得很好!我必须尝试一下,看看通过一些调整我是否可以实现我想要的。你看主要的问题是我只能有一个回调,所以给我一些时间来尝试你的解决方案,做一些更改,也给其他可能有dif的人一些时间不同的解决方案!