gpt4 book ai didi

c# - 如何将父转换为子以在 C# 中调用正确的函数

转载 作者:行者123 更新时间:2023-12-04 19:43:53 25 4
gpt4 key购买 nike

我首先使用 C#/代码我有一个家长类抽象公共(public)类 form_base {} 和几个不同的 child 类。这是其中一个

 public class form_Frais : form_base    {
}

我有一个包含所有 form_base 的 View ,但是当我单击其中一个时,我打开了一个通用模板。在通过 URL 更改 Controller /功能时,我只需要根据子类型更改映射

然后在我的 form_base我有这个:

 public T Cast<T>(object o)
{
return (T)o;
}

public dynamic converttt(Type LeTyp)
{
MethodInfo castMethod = GetType().GetMethod("Cast").MakeGenericMethod(new[] { LeTyp });
dynamic castedObject = castMethod.Invoke(Activator.CreateInstance(LeTyp), new object[] { this });
return castedObject;
}

我将我的项目分成两部分(引擎/Web)我的类在引擎中定义

我的问题是在 Web 部件中填写所有 form_base 的列表。我在 Controller 部分使用这个功能

 public ActionResult demandeur()
{
object model;

model = new { formsList = (from f in CurrentDBContext.forms_base select f).ToList().getCardModel(false) };
}

return View("demandeur", model);
}

并且在网络中我创建了扩展方法(我不会在引擎部分看到) 公共(public)静态部分类扩展 {

    public static List<formListItem> getCardModel(this List<form_base> items, bool envalidation)
{
List<formListItem> model = new List<formListItem>();
if (items != null && items.Count > 0)
{
foreach (var item in items)
{
Type LeTyp = item.GetType().BaseType;
dynamic castedObject = item.converttt(LeTyp);//Pb here not good type : System.Data.Entity.DynamicProxies.form_Frais_353DEAA5...' ne contient pas de définition pour 'getCardModel''

model.Add(castedObject.getCardModel(envalidation));
}
}
return model;
}

public static formListItem getCardModelBase(this form_base f)
{
formListItem model = new formListItem();
model.id = f.id;
model.libelle = f.title;
model.libelleType = f.formType.title;
model.libelleStatut = f.StatutInterneLibelle;
model.demandeur = f.demandeur.fullName;
model.idtype = f.formType.id;
return model;
}
public static formListItem getCardModel(this form_Frais form, bool envalidation)
{
formListItem model = ((form_base)form).getCardModelBase();
model.URL = "/forms/NoteFrais/InitForm"; //The good URL
model.envalidation = envalidation;
return model;
}
}

我试着把所有的东西都放在这样的扩展部分:

 public static T Cast<T>(object o)
{
return (T)o;
}


public static List<formListItem> getCardModel(this List<form_base> items, bool envalidation)
{
List<formListItem> model = new List<formListItem>();
if (items != null && items.Count > 0)
{
foreach (var item in items)
{
Type LeTyp = item.GetType().BaseType;
MethodInfo castMethod = item.GetType().BaseType.GetMethod("Cast").MakeGenericMethod(new[] { LeTyp });
dynamic castedObject = castMethod.Invoke(null, new object[] { item });

model.Add(castedObject.getCardModel(envalidation));
}
}
return model;
}

public static formListItem getCardModelBase(this form_base f)
{
formListItem model = new formListItem();
model.id = f.id;
model.libelle = f.title;
model.libelleType = f.formType.title;
model.libelleStatut = f.StatutInterneLibelle;
model.demandeur = f.demandeur.fullName;
model.idtype = f.formType.id;
return model;
}

但是我在 item.GetType().BaseType.GetMethod("Cast").MakeGenericMethod(new[] { LeTyp }); 中出错了导致 GetMethod("Cast") 返回 null

我所有的研究都来自here

更新

在简历中,第一次尝试时,我遇到了类型类返回动态代理的问题...在静态版本中,我找不到方法 Cast..

我试试

 MethodInfo[] methodInfos = LeTyp.GetMethods(BindingFlags.Public | BindingFlags.Static);

但是我的数组是空的...那么我在静态版本中的问题将是如何正确保存我的 Case 函数???并在扩展方法中使用它

更新 3

我在静态模式下发现问题我需要把 Cast 函数放在 note_frais 类中并使用它

 Type LeTyp = item.GetType().BaseType;
//MethodInfo[] methodInfos = LeTyp.GetMethods(BindingFlags.Public | BindingFlags.Static);
MethodInfo MI = LeTyp.GetMethod("Cast");//<T>.getMethod(cast)
MI = MI.MakeGenericMethod(typeof(form_base));
dynamic t = MI.Invoke(null, new object[] { item });

model.Add(t.getCardModel(envalidation));

但现在我将相同的 pb 分为两部分:

//Pb here not good type : System.Data.Entity.DynamicProxies.form_Frais_353DEAA5...' ne contient pas de définition pour 'getCardModel''

感谢您的帮助?我读了很多东西,但现在我完全迷路了。

最佳答案

代替:

GetMethod("Cast")

...试试这个重载:

GetMethod("Cast", new Type[] { typeof(Object) })

更多观察...

Cast<T>类的方法form_base不是静态的。 (请参阅上面的内容。)

类(class)form_base没有定义任何公共(public)静态方法。

(旁注,我不确定为什么类 extensions 被定义为 partial。)

Cast<T>类中的方法 extensions 静态的,但不是扩展方法。

要获得这个,您可以使用此重载,在类型 extensions:

typeof(extensions).GetMethod("Cast", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(Object) }, null)

如果您确实定义了 Cast<T> 扩展 类中的方法 extensions :

public static partial class extensions {
public static T Cast<T>(this form_base b, object o) {/*…*/}
}

...然后您可以使用相同的重载在类型 extensions 上获得它,通过修改 types参数:

typeof(extensions).GetMethod("Cast", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(form_base), typeof(Object) }, null)

关于c# - 如何将父转换为子以在 C# 中调用正确的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60492898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com