调用类型方法返回异常

时间:2017-08-20 21:27:25

标签: c# .net

我有一个字符串,其中包含一些我稍后将通过我的方法更改的单词: 例如:

Hello $name How are you doing ? 
i'm $ask 

我将使用方法更改$ name和$ ask:

    public static string ReturnLetter<T>(Dictionary<string, T> value)
    {
        var letter = File.ReadAllText("LETTER.html");
        var newletter = "";
        foreach (var type in value)
        {
            var item = type.Value;
            var newstring = item.GetType().GetMethod("ReturnValue").Invoke(null, new object[] { }).ToString();
            newletter = letter.Replace(type.Key, newstring);
        }
        return newletter;
    }

我使用以下内容返回词典值:

    public static Dictionary<string, Type> returnDic()
    {
        var types = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "ConsoleApplication11.Packets");
        var Dic = new Dictionary<string, Type>();
        foreach (var t in types)
        {
            Dic.Add(t.Name, t);
        }
        return Dic;
    } 

我持有的类型是:

class name
{
    private static string[] names =
    {
        "miri",
        "sara",
    };

    public static string ReturnValue()
    {
        var random = new Random();
        return names[random.Next(0, 1)];
    }
}

我在

处获得异常(空引用)
var newstring = item.GetType().GetMethod("ReturnValue").Invoke(null, new object[] { }).ToString();

我无法真正追踪错误的来源! 我现在已经坚持了一个小时

感谢任何帮助

编辑: 在有效的方法中:

    public static string ReturnValue<T>() 
    {
        return typeof(T).GetMethod("ReturnValue").Invoke(null,new object[] { }).ToString();
    }

然后我意识到item.GetType()返回RunTimeTime而不是返回哪个typeof(T)。

2 个答案:

答案 0 :(得分:0)

由于new_friend: __main__.Student似乎是item,请尝试替换

Type

item.GetType().GetMethod("ReturnValue")...

您试图在课程item.GetMethod("ReturnValue")... 而不是课程Type上找到该方法。由于它不存在,你得到一个空值。

但更好的架构会使用实例方法和接口。那时不需要反射来调用方法。

答案 1 :(得分:0)

我终于注意到了这个问题!

方法中的

public static Dictionary<string, Type> returnDic()
{
    var types = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "ConsoleApplication11.Packets");
    var Dic = new Dictionary<string, Type>();
    foreach (var t in types)
    {
        Dic.Add(t.Name, t);
    }
    return Dic;
}

我返回类型而不是T类型,并且在替换方法中我获得了类型类型

foreach (var type in value)
{
    var item = type.Value;
    var newstring = item.GetType().GetMethod("ReturnValue").Invoke(null, new object[] { }).ToString(); ////// GetType() of Type
    newletter = letter.Replace(type.Key, newstring);
}

我通过简单地将type.Value转换为Type

解决了这个问题
var item = type.Value as Type;