This workaround doesn't meet all 3 requirements (which is impossible imo) but it made up for the same functionality I wanted.
I ended up using a single class as Marc suggested in comments. But then I had the generic class nested inside the non generic class to act for the generic functionality.
public static class Class
{
public static void ClassMethod()
{
SharedMethod<object>();
}
static void SharedMethod<T>()
{
//----
}
public static void GenericClassMethod<T>()
{
return GenericClass<T>.SharedMethod();
}
static class GenericClass<T>
{
static void SharedMethod()
{
//available here since private members of outer class is visible to nested class
SharedMethod<T>();
}
}
}
So now, even though the calling has to be done little differently from how I wanted it originally in the question, functionally both are equal.