Нет. Компилятор не может знать то, что возвратил бы тип jerry.callFriend("spike")
. Кроме того, Ваша реализация просто скрывает бросок в методе без любой дополнительной безопасности типов. Рассмотрите это:
jerry.addFriend("quaker", new Duck());
jerry.callFriend("quaker", /* unused */ new Dog()); // dies with illegal cast
В этом конкретном случае, создавая метод краткого обзора talk()
и переопределяя его соответственно в подклассах служил бы Вам намного лучше:
Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());
jerry.callFriend("spike").talk();
jerry.callFriend("quacker").talk();
Я не верю, что Resharper может это сделать, но Open Source AutoMapper может. Впервые в AutoMapper? Посетите страницу Начало работы .
Вот простой класс для клонирования объекта. Это не совсем то, о чем вы просили, но, возможно, это будет полезно для вас:
//.Net 2.0
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
namespace YourNameSpace {
public static class ObjectCloner {
public static T Clone<T>(T obj) {
using (MemoryStream buffer = new MemoryStream()) {
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(buffer, obj);
buffer.Position = 0;
T temp = (T)formatter.Deserialize(buffer);
return temp;
}
}
}
}
Это тот вид вещей, для которого отлично подходит Cog . По сути, Cog - это инструмент для генерации кода. Код создается с помощью Python.
Простое копирование значений с одной стороны на другую довольно уродливо.
Возможно, вам будет лучше создать метод для включения в ваши классы, который использует отражение для копирования общедоступных свойств. Вы можете сохранить этот метод в resharper, чтобы преобразовать его в другие классы, в которых вам нужна эта функция.