C# 从对象类型获取匿名类型
对于下面显示的代码C# 从对象类型获取匿名类型,c#,anonymous-types,C#,Anonymous Types,对于下面显示的代码 using System; public class Test { public static void Main() { Test t = new Test(); object AnonymousInside= t.GetAnonymousType(); Console.Write(AnonymousInside.Key);//Error on compilation } public ob
using System;
public class Test
{
public static void Main()
{
Test t = new Test();
object AnonymousInside= t.GetAnonymousType();
Console.Write(AnonymousInside.Key);//Error on compilation
}
public object GetAnonymousType()
{
return new {Key="KeyName",Value="ValueName"};
}
}
如何从type对象
中取回匿名类型
如果这是不可能的,那么这个代码是如何工作的
@Html.TextBoxFor(model => model.ConfirmPassword, new { maxlength = 35, type = "password", @class="textArea margindrop",placeholder="Confirm password"})
它的你可以让它充满活力
dynamic AnonymousInside= t.GetAnonymousType();
虽然您应该使用类,但应该使用struct
如果仍要使用匿名类型 这在以下文件中提到: 编译器为每个匿名类型提供一个名称,尽管 应用程序无法访问它
因此,通过对象访问它的唯一方法是使用
反射
或动态
您可以使它成为动态的
dynamic AnonymousInside= t.GetAnonymousType();
虽然您应该使用类,但应该使用struct
如果仍要使用匿名类型 这在以下文件中提到: 编译器为每个匿名类型提供一个名称,尽管 应用程序无法访问它
因此,通过对象访问它的唯一方法是使用
反射
或动态
如果您不想使用动态
,您可以尝试类似的方法
using System;
public class Test
{
public static void Main()
{
var AnonymousInside = GetAnonymousTyped(GetAnonymousObject(), new {Key="",Value=""});
Console.Write(AnonymousInside.Key);//All Ok
}
public static T GetAnonymousTyped<T>(object o, T _)
{
return (T)o;
}
public static object GetAnonymousObject()
{
return new {Key="KeyName",Value="ValueName"};
}
}
使用系统;
公开课考试
{
公共静态void Main()
{
var AnonymousInside=GetAnonymousTyped(GetAnonymousObject(),new{Key=”“,Value=”“});
Console.Write(AnonymousInside.Key);//一切正常
}
公共静态T GetAnonymousTyped(对象o,T_u2;)
{
返回(T)o;
}
公共静态对象GetAnonymousObject()
{
返回新的{Key=“KeyName”,Value=“ValueName”};
}
}
如果您不想使用动态
您可以尝试以下方法
using System;
public class Test
{
public static void Main()
{
var AnonymousInside = GetAnonymousTyped(GetAnonymousObject(), new {Key="",Value=""});
Console.Write(AnonymousInside.Key);//All Ok
}
public static T GetAnonymousTyped<T>(object o, T _)
{
return (T)o;
}
public static object GetAnonymousObject()
{
return new {Key="KeyName",Value="ValueName"};
}
}
使用系统;
公开课考试
{
公共静态void Main()
{
var AnonymousInside=GetAnonymousTyped(GetAnonymousObject(),new{Key=”“,Value=”“});
Console.Write(AnonymousInside.Key);//一切正常
}
公共静态T GetAnonymousTyped(对象o,T_u2;)
{
返回(T)o;
}
公共静态对象GetAnonymousObject()
{
返回新的{Key=“KeyName”,Value=“ValueName”};
}
}
via Reflection probablyinside TextBoxFor的副本-已使用reflection@Grundy实际上,在方法中不允许匿名类型作为返回类型的原因可能是什么。我认为可以从方法的返回类型推断出类型。rite?@SubinJacob匿名类型仅在编译时获取其名称,因此您无法在via Reflection Probablyinsed TextBoxFor-used的代码时间副本中引用它reflection@Grundy实际上,在方法中不允许匿名类型作为返回类型的原因可能是什么。我认为可以从方法的返回类型推断出类型。rite?@SubinJacob匿名类型仅在编译时获取其名称,因此您无法在代码时引用它,但为什么需要动态类型?匿名类型已在编译时本身中定义。rite?没有必要为此使用对象
类型。我只想传递匿名数据.@ SujInAcOB在文档中提到:<代码>如果您想将它们传递到方法边界之外,考虑使用普通的命名结构或类而不是匿名类型。< /代码> @ SujICANOB,这将更清楚:<代码>编译器为每个匿名类型提供一个名称,尽管您的应用程序无法访问它代码>我不想使用反射或动态,因为不会有任何编译时检查。但是我希望会有一个,因为类型是在编译时定义的。如果可能的话,我可以在需要返回多个类型的场景中使用它。但是为什么需要动态类型呢?匿名类型已在编译时本身中定义。rite?没有必要为此使用对象
类型。我只想传递匿名数据.@ SujInAcOB在文档中提到:<代码>如果您想将它们传递到方法边界之外,考虑使用普通的命名结构或类而不是匿名类型。< /代码> @ SujICANOB,这将更清楚:<代码>编译器为每个匿名类型提供一个名称,尽管您的应用程序无法访问它代码>我不想使用反射或动态,因为不会有任何编译时检查。但是我希望会有一个,因为类型是在编译时定义的。如果可能的话,我可以在需要返回多个类型的场景中使用它。意思是,我必须定义两次类型?@SubinJacob是,第一次用于返回,第二次用于转换结果意味着,我必须定义两次类型?@SubinJacob是,第一次用于返回,第二次用于转换结果