Возможно ли создать наследуемый класс из статического метода класса-предка?

Есть ли возможность описать статический метод CreateFromBaseObject в классе MyBaseClass, чтобы при вызове этого метода из класса-потомка MyDerivedClass создавался экземпляр MyDerivedClass, но не использовался параметр U?
(Конечно без реализации метода CreateFromBaseObject внутри MyDerivedClass)
public abstract class MyBaseClass<T>
   where T : class, new()
{
    protected T RealObject = new T();
    public void setRealObject(dynamic realObject) {   this.RealObject = realObject;   }
    public static U CreateFromBaseObject<U>(T baseObject)    where U : MyBaseClass<T>, new()
    {
        var t = new U();
        t.setRealObject(baseObject);
        return t;
    }    
}
...
public class MyDerivedClass : MyBaseClass<RealDerivedClass>{...}
...
RealDerivedClass realDerivedClass = new RealDerivedClass();
//Приходится так:
MyDerivedClass myRealDerivedClass = MyDerivedClass.CreateFromBaseObject<MyDerivedClass>(realDerivedClass);
//А хочется так:
MyDerivedClass myRealDerivedClass = MyDerivedClass.CreateFromBaseObject(realDerivedClass);
  • Вопрос задан
  • 269 просмотров
Пригласить эксперта
Ответы на вопрос 2
DmitryITWorksMakarov
@DmitryITWorksMakarov
А что если так:
using System;

namespace answer
{
	using System;
	
	public abstract class MyBaseClass<T, T2>
		where T : class, new()
		where T2: class, new()
	{
		protected T RealObject = new T();
		public void setRealObject(dynamic realObject) {   this.RealObject = realObject;   }

		public static U CreateFromBaseObject<U>(T baseObject)  where U : MyBaseClass<T>, new()
		{
			var t = new U();  t.setRealObject(baseObject);  return t;
		}    

		public static T2 CreateFromBaseObject(T baseObject)
		{
			return CreateFromBaseObject<T2>(baseObject);
		}
	}

	public class RealDerivedClass {}
	public class MyDerivedClass : MyBaseClass<RealDerivedClass, MyDerivedClass>{}
	
	public class Test
	{
		public static void Main()
		{
			RealDerivedClass realDerivedClass = new RealDerivedClass();
			//Приходится так:
			MyDerivedClass myRealDerivedClass = MyDerivedClass.CreateFromBaseObject<MyDerivedClass>(realDerivedClass);
			//А хочется так:
			MyDerivedClass myRealDerivedClass2 = MyDerivedClass.CreateFromBaseObject(realDerivedClass);
		}
	}
}
Ответ написан
Комментировать
IamKarlson
@IamKarlson
ASP(?).NET, SQL-разработчик
как вариант юзать рефлексию через caller member name

пример для INotifyPropertyCahnged inotifypropertychanged without the backing fields

дока
msdn
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы