如何转换通用C#操作<;T1>;采取行动<;T2>;
我一直在与C#合作学习和创造一些东西;不幸的是,我对C#很陌生,我的演员阵容有些问题 我有一个Type1的动作,我想把它转换成Type2;这两种类型在编译时都是已知的。下面是我试图归档的内容的示例代码如何转换通用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 ) {
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的人一些时间不同的解决方案!